Command pattern with invoker and receiver : Command Pattern « Design Pattern « Java Tutorial






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








34.8.Command Pattern
34.8.1.Command: choosing the operation at run-time
34.8.2.Command pattern with invoker and receiver