Java Tutorial/Design Pattern/Command Pattern

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

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>