Head First 设计模式(6)命令模式

2021-07-13  本文已影响0人  kaiker

1、本章的例子——遥控器

遥控器上有on off undo的按钮,希望遥控器可以通过按钮操控不同的产品

遥控器需要操作非常多硬件

需要有一种模式,将发出请求的对象和执行请求的对象分离开

public interface Command {
  public void execute();
}

// 所有的动作变为类,实现统一的接口,将类的对象提供给给执行者,执行者调用接口中统一的方法,就达到解耦的目的。
public class LightOnCommond implements Commond {
  Light light;
  public LightOnCommond(Light light) {
    this.light = light;
  }
  public void execute() {
    light.on();
  }
}

public class SimpleRemoteControl {
  Command slot;

  public SimpleRemoteControl() {}

  public void setCommand(Command command) {
    this.slot = command;
  }

  public void buttonWasPressed() {
    slot.execute();
  }
}

2、命令模式

将请求封装成对象,以便使用不同的请求,队列或日志来参数化其他对象。命令模式也支持可撤销的操作。

命令模式类图 遥控器中的命令模式

3、例子继续——取消以及带有状态的命令

public interface Command {
  public void execute();
  public void undo();
}

public class LightOnCommand implements Command {
  Light light;
  public LightOnCommand(Light light) {this.light = light}
  public void undo() {light.off();}
}
遥控器支持undo

如果命令存在状态,则多使用一个状态进行记录

宏命令,一次进行多个操作。

public class MacroCommand implments Command {
  Command[] commands;
  public MacroCommand(Command[] commands) {this.commands = commands;}
  public void execute() {
    for (int i = 0; i < commands.length; i++) {commands[i].execute();}
  }
}

当需要将发出请求的对象和执行请求的对象解耦的时候,使用命令模式。

上一篇下一篇

猜你喜欢

热点阅读