重修设计模式-行为型-命令模式
The command pattern encapsulates a request as an object, thereby letting us parameterize other objects with different requests, queue or log requests, and support undoable operations.
命令模式将请求(命令)封装为一个对象,这样可以使用不同的请求参数化其他对象(将不同请求依赖注入到其他对象),并且能够支持请求(命令)的排队执行、记录日志、撤销等(附加控制)功能。
命令模式(Command Pattern)可将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中, 且能实现可撤销操作。
命令模式的核心是将一个个命令封装成一个个对象,从而方便控制和执行。命令模式的主要作用和应用场景,是用来控制命令的执行,比如,异步、延迟、排队执行命令、撤销重做命令、存储命令、给命令记录日志等等。通过命令模式,可以使得请求发送者和接收者之间解耦,从而提高了系统的灵活性和可扩展性。
命令模式主要由以下几个组件构成:
- 命令接口(Command):
- 定义一个用于执行请求的接口。
- 通常情况下,这个接口会声明一个
execute()
方法,用于执行命令。
- 具体命令类(Concrete Command):
- 实现命令接口,将接收者对象绑定到具体的动作上。
- 调用接收者的方法来执行请求。
- 接收者(Receiver):
- 知道如何执行与请求相关的操作。
- 任何类都可以作为接收者对象,只要它能执行与请求相关的操作。
- 调用者(Invoker):
- 要求命令对象执行请求。
- 它持有一个命令对象的引用,可以在需要时调用该命令。
- 客户端(Client):
- 创建具体的命令对象,并设置其接收者。
- 将命令对象传递给调用者。
举个例子,用命令模式实现灯的开关控制场景。
// 1.接收者(Receiver),封装了请求相关的操作。
class Light { public void on() { System.out.println("Light is on"); } public void off() { System.out.println("Light is off"); }
} // 2.命令接口(Command)
interface Command { void execute();
} // 3.具体命令类:开灯命令
class LightOnCommand implements Command { private Light light; public LightOnCommand(Light light) { this.light = light; } @Override public void execute() { light.on(); }
} // 3.具体命令类:关灯命令
class LightOffCommand implements Command { private Light light; public LightOffCommand(Light light) { this.light = light; } @Override public void execute() { light.off(); }
} // 4.调用者(Invoker)
class RemoteControl { private Command command; public void setCommand(Command command) { this.command = command; } public void pressButton() { command.execute(); }
} // 5.客户端(Client)
public class Client { public static void main(String[] args) { //创建接收者Light light = new Light(); //创建命令Command lightOnCommand = new LightOnCommand(light); Command lightOffCommand = new LightOffCommand(light); //创建调用者并与特定命令关联RemoteControl remoteControl = new RemoteControl(); remoteControl.setCommand(lightOnCommand); remoteControl.pressButton(); // 输出: Light is on remoteControl.setCommand(lightOffCommand); remoteControl.pressButton(); // 输出: Light is off }
}
总结
命令模式的主要作用和应用场景,是用来控制命令的执行,比如,异步、延迟、排队执行命令、撤销重做命令、存储命令、给命令记录日志等等,这才是命令模式能发挥作用的地方。