Java Tutorial/Design Pattern/Command Pattern
Command: choosing the operation at run-time
<source lang="java">
import java.util.ArrayList; import java.util.Iterator; import java.util.List; interface Command {
void execute();
} class NewDocument implements Command {
public void execute() { System.out.print("NewDocument "); }
} class SaveDocument implements Command {
public void execute() { System.out.print("SaveDocument! "); }
} class UpdateDocument implements Command {
public void execute() { System.out.print("UpdateDocument"); }
} class Macro {
private List commands = new ArrayList(); public void add(Command c) { commands.add(c); } public void run() { Iterator it = commands.iterator(); while (it.hasNext()) ((Command) it.next()).execute(); }
} public class CommandPattern {
public static void main(String args[]) { Macro macro = new Macro(); macro.add(new NewDocument()); macro.add(new SaveDocument()); macro.add(new UpdateDocument()); macro.run(); }
}</source>
Command pattern with invoker and receiver
<source lang="java">
public class TestCommands {
public static void main(String args[]) { TestCommands t = new TestCommands(); } public TestCommands() { Invoker invoker = new Invoker(); Receiver3 asiaServer = new Receiver3(); ShutDownCommand shutDownAsia = new ShutDownCommand(asiaServer); RebootCommand rebootAsia = new RebootCommand(asiaServer); invoker.setCommand(shutDownAsia); invoker.run(); invoker.setCommand(rebootAsia); invoker.run(); invoker.undo(); invoker.undo(); }
} interface Receiver {
public void connect(); public void diagnostics(); public void reboot(); public void shutdown(); public void disconnect();
} class Invoker {
Command commands[] = new Command[5]; int position; public Invoker() { position = -1; } public void setCommand(Command c) { if (position < commands.length - 1) { position++; commands[position] = c; } else { for (int loopIndex = 0; loopIndex < commands.length - 2; loopIndex++) { commands[loopIndex] = commands[loopIndex + 1]; } commands[commands.length - 1] = c; } } public void run() { commands[position].execute(); } public void undo() { if (position >= 0) { commands[position].undo(); } position--; }
} class Receiver1 implements Receiver {
public Receiver1() { } public void connect() { System.out.println("connected to 1."); } public void diagnostics() { System.out.println("The receiver 1diagnostics check out OK."); } public void shutdown() { System.out.println("Shutting down the recediver 1."); } public void reboot() { System.out.println("Rebooting the receiver 1."); } public void disconnect() { System.out.println("disconnected from the reciver 1."); }
} class Receiver2 implements Receiver {
public Receiver2() { } public void connect() { System.out.println("connected to the receiver 2."); } public void diagnostics() { System.out.println("The receiver 2 diagnostics check out OK."); } public void shutdown() { System.out.println("Shutting down the receiver 2."); } public void reboot() { System.out.println("Rebooting the receiver 2."); } public void disconnect() { System.out.println("disconnected from the receiver 2."); }
} class Receiver3 implements Receiver {
public Receiver3() { } public void connect() { System.out.println("connected to the receiver 3."); } public void diagnostics() { System.out.println("The receiver 3 diagnostics check out OK."); } public void shutdown() { System.out.println("Shutting down the receiver 3."); } public void reboot() { System.out.println("Rebooting the receiver 3."); } public void disconnect() { System.out.println("disconnected from the receiver 3."); }
} interface Command {
public void execute(); public void undo();
} class RebootCommand implements Command {
Receiver receiver; public RebootCommand(Receiver r) { receiver = r; } public void execute() { receiver.connect(); receiver.reboot(); receiver.disconnect(); System.out.println(); } public void undo() { System.out.println("Undoing..."); receiver.connect(); receiver.shutdown(); receiver.disconnect(); System.out.println(); }
} class ShutDownCommand implements Command {
Receiver receiver; public ShutDownCommand(Receiver r) { receiver = r; } public void execute() { receiver.connect(); receiver.shutdown(); receiver.disconnect(); } public void undo() { receiver.connect(); receiver.reboot(); receiver.disconnect(); }
} class DiagnosticsCommand implements Command {
Receiver receiver; public DiagnosticsCommand(Receiver r) { receiver = r; } public void execute() { receiver.connect(); receiver.diagnostics(); receiver.disconnect(); System.out.println("execute"); } public void undo() { System.out.println("Undo."); }
}</source>