210 likes | 352 Views
Computer Science 313 – Advanced Programming Topics. Lecture 20: Implementing Commands. Using a Design Pattern. Design patterns are tools Each pattern has reason for being Choose matching pattern to design need Design & coding is simple if choosing correctly
E N D
Computer Science 313 – Advanced Programming Topics Lecture 20:Implementing Commands
Using a Design Pattern • Design patterns are tools • Each pattern has reason for being • Choose matching pattern to design need • Design & coding is simple if choosing correctly • Life sucks when forced; coding is impossible • Knowing pattern intent crucial for good design • Make use as simple as adding pattern to client code
Command Pattern Intent • What is the intent of command pattern?
Decoupling Without Texts • Command pattern decouples (splits) What we want to do Who does it When it is done
Decoupling Without Texts • Command pattern decouples (splits) What we want to do Who does it When it is done
Command of Command Pattern • Command declares method(s) defining actions • Limit to fewest methods • undo included, if desired • Must be abstract type • Interface is possible • Can be abstract class • Terms interchangablefor design purposes
Warning! Warning! Warning! • Caution is needed if Command is abstract class • All ConcreteCommandsuse fields being declared • Big hint suggesting Command Pattern incorrect • Abstracts what is executed from the code • Should be casting as wide a net as possible • Requiring common details is a rather limited net • Consider using Strategy Pattern may be better • Add fields to Contextclass executing the strategy • Method in strategy passed field as parameter
Command Interface Example • Should be short & simple • Use additional methods if more are needed • Often methods void for maximum usability • Returns value to Receiver in other cases public interface Command {public void execute(); public void undo(); }
Invoker of Command Pattern • Stores Commandinstance(s) • Only refers to interface • May change object held • Changes made externally • Starts action execution • Any reason valid forwhy this happens • Actual execution maybe delayed
Invoker Class Example • Blindly calls executefor correct Command • Select one if multiple Commandsreferred to • Simple class that does not care what happens public class Remote {Command[] btnCommands; void buttonWasPushed(int slot){btnCommands[slot].execute();} }
Receiver in Command Pattern • With ConcreteCommand, performs the action • Real work done by Receiver • Uses Commandtomake & order calls • Independent of Invoker • Lacks knowledge of how it is called • Also called functor or callback
Receiver Class Example • Has methods needed to execute action • Can be written to split work across method public class CDPlayer {boolean powered, trayOpen;public void turnOn() {powered = true; }public void closeTray() {trayOpen = false; } }
ConcreteCommandin Pattern • Calls method(s) in Receiver to perform action • Includes fields it will need • Also acts on own • Separates Invoker &Receiver • Prevents from needing the other • State defines it &its actions
ConcreteCommand Example class LtCommand implements Command {Light bulb;public LtCommand(Light l) { bulb = l;}public void execute() {bulb.turnOn();}public void undo() { if (bulb.on()) { bulb.turnOff(); } else { bulb.turnOn(); }}
MultiCommand Example • Party mode combines multiple Receivers class PartyCommand implements Command { Stereo stereo;public MultiCommand(Stereo s) { stereo = s; }public void execute() {stereo.turnOn();stereo.closeTray();}
ComplexCommand Example • Can also perform actions on its own class OpenCommand implements Command { Application app;public void execute() { String name = askUser(); doc = new Document();app.add(doc);doc.open();}
MacroCommand Example • Define macros which compose Commands class MacroCommand implements Command {ArrayList<Command> cmd;public void addCommand(Command c) {cmd.add(c);}public void execute() { for (Command c : cmd) c.execute();} }
Client in Command Pattern • Helps perform actual action • Works with ConcreteCommand • Sets the Invoker’sCommands • Not involved in execution of actions
Client Class Example • Creates Commandsfor program to use • Gets references to the Receivers • Sets Commandfor the Invokers Command lc = new LtCommand(light);Command sc = new StereoCommand(s); Command mc = new MacroCommand();mc.addCommand(lc);mc.addCommand(sc);remote.setOnCommand(0, lc);remote.setOnCommand(1, sc); remote.setOnCommand(2, mc);
For Next Class • Read remainder of the chapter • Complete command pattern lecture & discussion • How would we go about creating logs of Commands? • Why does CSC351 need this pattern & how is it good? • And what in the world could CSC310 need this work? • Midterm #1 in class on Friday • Open-book, open-note exam (as usual) • Have been given & should use pattern reports • No computers, slides, or friends, however