command design pattern source: design patterns – elements of reusable object- oriented software;...

10
Command Design Pattern Source: Design Patterns – Elements of Reusable Object-Oriented Software; Gamma, et. al.

Upload: aleesha-phelps

Post on 21-Dec-2015

217 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Command Design Pattern Source: Design Patterns – Elements of Reusable Object- Oriented Software; Gamma, et. al

Command Design PatternSource: Design Patterns – Elements of Reusable Object-

Oriented Software; Gamma, et. al.

Page 2: Command Design Pattern Source: Design Patterns – Elements of Reusable Object- Oriented Software; Gamma, et. al

Problem• Sometimes a class needs to perform actions without knowing what the

actions are

Page 3: Command Design Pattern Source: Design Patterns – Elements of Reusable Object- Oriented Software; Gamma, et. al

Example: GUI Toolkit• A GUI toolkit provides a full complement of components

– Buttons, scroll bars, text boxes, menus, etc.

• Toolkit components know how to draw themselves on the screen, but they don't know how to perform application logic

• Application developers need a way to associate application logic with GUI components– What should happen when a button is pressed?– What should happen when a menu item is selected?

• GUI components need to perform an unknown operation when they are activated by the user

Page 4: Command Design Pattern Source: Design Patterns – Elements of Reusable Object- Oriented Software; Gamma, et. al

Solution

+Execute()

«interface»Command

+Execute()+AskUser()

-app

Open Command

+Open()+Close()+Save()+Cut()+Copy()+Paste()+Print()

Document

name = AskUser();doc = new Document();app->Add(doc);doc->Open();

+Execute()

-app

Save Command

doc = app->GetCurrent();doc->Save();

+Execute()

-app

Print Command

+Add(in doc : Document)+GetCurrent() : Document

Application

1 *

doc = app->GetCurrent();doc->Print();

Menu Menu Bar1*Menu Item 1*

Page 5: Command Design Pattern Source: Design Patterns – Elements of Reusable Object- Oriented Software; Gamma, et. al

Solution+Execute()

«interface»Command

+Execute()

+receiver+state

Concrete Command

+Action(in state)

Receiver

-command

Invoker

Client

receiver->Action(state);

Client

ReceiverNew()

Concrete CommandNew(receiver, state)

InvokerNew(command)

Execute()

Action(state)

Page 6: Command Design Pattern Source: Design Patterns – Elements of Reusable Object- Oriented Software; Gamma, et. al

Consequences

• Completely decouples objects from the actions they execute

• Objects can be parameterized with arbitrary actions

• Adding new kinds of actions is easy

– Just create a new class that implements the Command interface

Page 7: Command Design Pattern Source: Design Patterns – Elements of Reusable Object- Oriented Software; Gamma, et. al

Known Uses: Task Scheduling Service

• Generic task scheduling service allow tasks to be scheduled by

– Interval (e.g., every hour)

– Date/time (e.g., on February 8th at 1:00pm)

– Etc.

• Tasks are defined using Command objects

• Scheduling service executes Command object at the appropriate time, having no idea what it actually does

Page 8: Command Design Pattern Source: Design Patterns – Elements of Reusable Object- Oriented Software; Gamma, et. al

Known Uses: Undo/Redo• Store a list of actions performed by the user

• Each action has

– A “do” method that knows how to perform the action

– An “undo” method that knows how to reverse the action

• Store a pointer to the most recent action performed by the user

• Undo – “undo” the current action and back up the pointer

• Redo – move the pointer forward and “redo” the current action

Page 9: Command Design Pattern Source: Design Patterns – Elements of Reusable Object- Oriented Software; Gamma, et. al

Known Uses: Recording user actions

• Macros

– Record a sequence of user actions so they can be turned into a macro

– Macro can be re-executed on demand by the user

Page 10: Command Design Pattern Source: Design Patterns – Elements of Reusable Object- Oriented Software; Gamma, et. al

Known Uses: Multi-user network games

• Actions performed by a player must be broadcast to all other players and executed on their local machines

• How could we use the Command pattern to do this?