chapter06_封装调用——命令模式

  • (1) 命令模式可以将__方法调用__封装起来

    (2) 命令模式将__动作的请求者__ 从 __动作的执行者__对象中解耦

    示例

    动作的请求者:人

    动作的执行者:灯

    中间引入了一层__命令__,使得人和灯解耦,人只需要控制这些命令即可(类似遥控器)

  • 所有的命令对象实现相同的命令接口, 用来执行和撤销命令

      public interface Command {
    
          void execute();
    
          void undo();
      }
    
  • 具体的命令实现类在构造函数中传入动作的接收者

      public class LightOnCommand implements Command {
    
          private final Light light;
    
          public LightOnCommand(Light light) {
      
              this.light = light;
          }
    
          public void execute() {
              light.on();
          }
    
          public void undo() {
              light.off();
          }
      }
    

    在LightOnCommand命令对象中, 动作的接收者是Light

    Light.java

      public class Light {
    
          ...
    
          public void on() {
      
              System.out.println("Light is on");
          }
    
          public void off() {
      
              System.out.println("Light is off");
          }
    
          ...
      }
    

    在动作的请求者对象中, 只需传入命令对象, 无需传入动作的接收者对象, 这样就实现了动作的请求者和动作的接收者的解耦

    RemoteControl.java

      public class RemoteControl {
    
          private Command onCommand;
          private Command offCommand;
    
          public RemoteControl() {
    
              onCommands = new NoCommand();
              offCommands = new NoCommand();
          }
    
          public void setCommand(Command onCommand, Command offCommand) {
    
              this.onCommand = onCommand;
              this.offCommand = offCommand;
          }
    
          public void onButtonWasPushed() {
    
              onCommand.execute();
          }
    
          public void offButtonWasPushed() {
    
              offCommand.execute();
          }
    
          ...
      }
    
  • 命令模式

    将命令封装成对象, 以便使用不同的请求、队列或日志来参数化其他对象

  • 利用命令模式实现撤销操作

    请求调用者内部封装一条undoCommand命令, 每次调用命令时更新

  • 命令模式的实际用途

    (1) 线程池和Callable

    (2) 日志系统

上一篇:POJ 3533 Light Switching Game(三维Nim积)


下一篇:three.js学习:点光源+动画的实现