Command Design Pattern Rick Mercer and Rice University 1 Command Design Pattern The Command Pattern encapsulates a request as an object, thereby letting you parameterize other objects with different requests, queue or log requests, and support undoable operations. 2 General Form 3 Example for Heads First Note: RemoteLoader loads commands into slots of the remote control 4 Command Pattern One object can send messages to other objects without knowing anything about the actual operation or the type of object Polymorphism lets us encapsulate a request for services as an object Establish a method signature name as an interface Vary the algorithms in the called methods 5 Java Examples Sun used the Command pattern to improve the event model in Java 1.1 one example method signature: public void actionPerfomed(ActionEvent e) JButtons and JTextFields send actionPerformed messages to "command" objects (the listeners) without knowing what will happen Event generators — buttons, text fields, mouse — have listener objects (actually a Vector of listener objects) 6 Uses The Command object can also be used when you need to tell the program to execute the command later. In such cases, you are saving commands as objects to be executed later You could also sending command objects over the network (in new project) or save them in a collection class such as a Stack for undo/redo operations 7 Example we saw before was Command Make 3 command classes Log instances by writing the objects to a file See SaveWorkCommands .java in the Eclipse project CommandPattern (command.zip) Like RemoteLoader in HFSP or Client in gen. form Read the objects later and execute them See ExecuteSavedCommands .java in the Eclipse project CommandPattern (command.zip) Like Light on HFSP or Receiver in gen. form 8 A UML View of the Sample 9 import java.io.Serializable; // Command design pattern - Decoupling producer from consumer. public interface WorkCommand { void execute(); } class DomesticEngineer implements WorkCommand, Serializable { public void execute() { System.out.println("Take out the trash."); } } class Politician implements WorkCommand, Serializable { public void execute() { System.out.println("Take money from the rich, take votes from the poor."); } } class Programmer implements WorkCommand, Serializable { public void execute() { System.out.println("Sell the bugs, charge extra for the fixes."); } } 10 Code Demo Need these three files WorkCommand.java CommandClient.java CommandServer.java 11 Summary The Command design pattern encapsulates the concept of a command into an object A command object could be sent across a network to be executed elsewhere or it could be saved as a log of operations 12 References [Adelson and Soloway] B. Adelson and E. Soloway. The Role of Domain Experience in Software Design. IEEE Trans. on Software Engineering, V SE-11, N 11, 1985, pp. 1351-1360. [Linn and Clancy] M. Linn and M. Clancy, The Case for Case Studies of Programming Problems. Communications of the ACM V 35 N 3, March 1992, pp. 121-132. [Soloway and Ehrlich] E. Soloway and K. Ehrlich, Empirical Studies of Programming Knowledge, IEEE Transactions on Software Engineering V SE-10, N 5, September 1984. [Curtis] B. Curtis, Cognitive Issues in Reusing Software Artifacts. In Software Reusability, V II. ed. T. Biggerstaff and A. Perlis, Addison Wesley 1989, pp. 269-287. [Sierra and Bates ], Heads First Design Patterns http://www.exciton.cs.rice.edu/JavaResources/DesignPatterns/comman d.htm 13