定义

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

  • 命令模式将发出请求的对象和执行请求的对象解耦
  • 再被解耦的两者之间是通过命令对象进行沟通的, 命令对象封装了接收者的一个或一组动作
  • 宏命令是命令的一种简单的延伸, 允许调用多个命令

**

案例

背景:一个遥控器有很多按钮, 按钮按下, 相应的命令发出, 执行对应的动作, 设计可拓展的系统
结构如下:
image.png

设计命令Command接口, 遥控器持有接口的属性, 调用接口的方法, 与具体实现解耦

  1. public interface Command {
  2. void execute();
  3. }

具体命令实现命令接口, 并持有light对象, 在execute方法中实现具体的操作

  1. public class LightOnCommand implements Command {
  2. Light light;
  3. public LightOnCommand(Light light) {
  4. this.light = light;
  5. }
  6. @Override
  7. public void execute() {
  8. light.turnOnLight();
  9. }
  10. }

遥控器可以setCommand, 按下按钮执行execute

  1. public class SimpleRemoteControl {
  2. Command slot;
  3. public SimpleRemoteControl() {
  4. }
  5. public void setCommand(Command command) {
  6. slot = command;
  7. }
  8. public void buttonWasPressed() {
  9. slot.execute();
  10. }
  11. }

测试

  1. @Test
  2. public void testCommand() {
  3. LightOnCommand command = new LightOnCommand(new Light());
  4. SimpleRemoteControl control = new SimpleRemoteControl();
  5. control.setCommand(command);
  6. control.buttonWasPressed();
  7. }
  8. 结果:
  9. 开灯=========>

image.png