场景描述

贝勒爷喜欢吃京酱肉丝,跟店小二点名厨子小孙给他做一道绝美的鱼香肉丝,再配两个小菜;店小二告诉厨子小孙,这是贝勒爷的命令,必须得伺候好。

命令模式:将⼀个请求封装成⼀个对象,从⽽让你使⽤不同的请求把客户端 参数化,对请求排队或者记录请求⽇志,可以提供命令的撤销和恢复功能。

命令模式的关键在于引入了抽象命令类,请求发送者针对抽象命令类编程,只有实现了抽象命令类的具体命令才与请求接收者相关联。

类图关系

image-1669088566296

  • Receiver接受者⻆⾊:该⻆⾊就是⼲活的⻆⾊,命令传递到这⾥是应该被执⾏的

  • Command命令⻆⾊:需要执⾏的所有命令都在这⾥声明

  • Invoker调⽤者⻆⾊:接收到命令,并执⾏命令

代码示例

interface Commend {

   void execute();

}

interface Receiver {

   void action();

}

class ChiefReceiver implements Receiver {

   @Override
   public void action() {
       System.out.println("coking");
   }
}

class OrderCommend implements Commend {

   private Receiver receiver;

   public OrderCommend(Receiver receiver) {
       this.receiver = receiver;
   }

   @Override
   public void execute() {
       receiver.action();
   }
}

class Invoker {
   List<Commend> commends = new ArrayList<>();

   public void add(Commend commend) {
       commends.add(commend);
   }

   public void invoke() {
       for (Commend commend : commends) {
           commend.execute();
       }
   }


}


public class Client {

   public static void main(String[] args) {
       ChiefReceiver receiver = new ChiefReceiver();
       Invoker invoker = new Invoker();
       OrderCommend commend1 = new OrderCommend(receiver);
       OrderCommend commend2 = new OrderCommend(receiver);
       invoker.add(commend1);
       invoker.add(commend2);
       invoker.invoke();
   }
}

使用场景

  • 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。

  • 系统需要在不同的时间指定请求、将请求排队和执行请求。

  • 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。

  • 系统需要将一组操作组合在一起,即支持宏命令。