Java Tutorial/Design Pattern/Command Pattern

Материал из Java эксперт
Перейти к: навигация, поиск

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