Java设计模式之命令模式

110 阅读1分钟

命令模式

将一个请求封装为一个对象(即我们创建的Command对象),从而使你可用不同的请求对客户进行参数化; 对请求排队或记录请求日志,以及支持可撤销的操作。

代码展示

  1. 定义一个抽象的命令接口

    public interface Command {

     void execute();

    }

  2. 定义一个 Receiver 负责执行命令

    public class Receiver {

     public void doSomething() {
          System.out.println("番茄炒西红柿");  
     }

    }

  3. 定义一个具体的命令, 创建命令的时候会指定命令的执行者 Receiver

    public class ConcreteCommand implements Command {

     private Receiver receiver;
    
     public ConcreteCommand(Receiver receiver) {
         this.receiver = receiver;
     }
    
     @Override
     public void execute() {
         receiver.doSomething();
     }

    }

  4. 定义一个调用者 Invoker

    public class Invoker {

     private Command command;
    
     public void setCommand(Command command) {
         this.command = command;
     }
    
     public void action() {
         command.execute();
     }

    }

  5. 定义一个Client类

    public class Client {

     public static void main(String[] args) {
         Receiver receiver = new Receiver();
         Command command = new ConcreteCommand(receiver);
         Invoker invoker = new Invoker();
         invoker.setCommand(command);
         invoker.action();
     }

    }

角色介绍

情景: 饭店里一个客户在看菜单, 服务员在下单, 厨师在后厨做菜.

客户: Client; 服务员: Invoker ; 厨师: Receiver; 番茄炒西红柿: ConcreteCommand

这个就是准备好的菜单:

Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);

如果客户要退菜就得告诉服务员番茄炒西红柿不要了. 同理如果客户觉得番茄炒西红柿很好吃可以再加一份.所以命令的取消和重新发起逻辑应该是由服务员(Invoker) 来实现的. 然而我常常遇到的情况是服务员说菜已经好了. 那就没有办法退菜(取消命令)了.