设计模式-命令模式
命令模式(Command Pattern) 是一种行为型设计模式,它将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
命令模式的核心思想是 将请求的发出者与处理者解耦,请求的发出者只需知道如何调用命令,而不需要了解命令的具体执行细节。
命令模式的组成部分
- 命令接口(Command):定义了一个统一的接口,用于执行命令。
- 具体命令类(ConcreteCommand):实现命令接口,封装具体的操作逻辑。
- 接收者(Receiver):实际执行命令的类,包含具体的操作实现。
- 调用者(Invoker):负责调用命令对象以执行请求。
- 客户端(Client):创建具体命令对象并将其绑定到接收者和调用者。
命令模式的使用场景
- 需要对行为进行封装时:将动作抽象成命令类对象。
- 支持撤销/重做功能:通过保存命令历史记录。
- 支持请求的排队和日志功能。
- 需要将调用者与实际执行者解耦。
示例:智能家居命令控制
假设我们有一个智能家居系统,可以通过命令模式来控制灯的开关操作。
1. 定义命令接口
// 命令接口
interface Command {
void execute(); // 执行命令
void undo(); // 撤销命令
}
2. 创建接收者(Receiver)
// 接收者:灯
class Light {
public void turnOn() {
System.out.println("灯已打开");
}
public void turnOff() {
System.out.println("灯已关闭");
}
}
3. 创建具体命令类
// 具体命令:打开灯
class TurnOnLightCommand implements Command {
private Light light;
public TurnOnLightCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOn();
}
@Override
public void undo() {
light.turnOff();
}
}
// 具体命令:关闭灯
class TurnOffLightCommand implements Command {
private Light light;
public TurnOffLightCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOff();
}
@Override
public void undo() {
light.turnOn();
}
}
4. 创建调用者(Invoker)
// 调用者:遥控器
class RemoteControl {
private Command command;
// 设置命令
public void setCommand(Command command) {
this.command = command;
}
// 执行命令
public void pressButton() {
if (command != null) {
command.execute();
}
}
// 撤销命令
public void pressUndo() {
if (command != null) {
command.undo();
}
}
}
5. 客户端代码
public class CommandPatternExample {
public static void main(String[] args) {
// 创建接收者(灯)
Light light = new Light();
// 创建具体命令对象
Command turnOnCommand = new TurnOnLightCommand(light);
Command turnOffCommand = new TurnOffLightCommand(light);
// 创建调用者(遥控器)
RemoteControl remote = new RemoteControl();
// 绑定打开灯命令并执行
remote.setCommand(turnOnCommand);
remote.pressButton(); // 输出:灯已打开
// 撤销打开灯命令
remote.pressUndo(); // 输出:灯已关闭
// 绑定关闭灯命令并执行
remote.setCommand(turnOffCommand);
remote.pressButton(); // 输出:灯已关闭
// 撤销关闭灯命令
remote.pressUndo(); // 输出:灯已打开
}
}
运行结果
灯已打开
灯已关闭
灯已关闭
灯已打开
优点
- 降低耦合:命令模式将请求发送者和实际执行者分离。
- 支持扩展:可以轻松增加新的命令,而无需修改已有代码。
- 支持撤销和重做:通过命令对象保存操作状态。
缺点
- 增加了类的数量:每个具体命令类都会新增一个类。
- 增加了系统的复杂性:特别是当命令较多时。
总结
命令模式通过将请求封装为命令对象,使得请求的发出者和接收者之间完全解耦。它特别适合在需要支持操作撤销、请求排队等功能的场景中应用。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体