Java Tutorial/Design Pattern/Command Pattern
Command: choosing the operation at run-time
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();
}
}
Command pattern with invoker and receiver
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.");
}
}