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."); } }