设计模式——命令模式

设计模式——命令模式一 命令模式的概念与动机命令模式是一种行为设计模式 它使你能够把方法调用封装在对象中 这样你就可以像传递参数一样传递方法调用 命令模式的核心思想是将 请求 封装成一个对象 以便使用不同的请求 队列请求 撤销操作 甚至支持事务处理

大家好,欢迎来到IT知识分享网。

一、命令模式的概念与动机

命令模式是一种行为设计模式,它使你能够把方法调用封装在对象中,这样你就可以像传递参数一样传递方法调用。命令模式的核心思想是将“请求”封装成一个对象,以便使用不同的请求、队列请求、撤销操作,甚至支持事务处理。

适用场景

  • 将请求调用者和接收者解耦,请求发送者无需了解如何执行请求的具体细节。
  • 需要支持可撤销/重做操作的功能。
  • 需要记录并回放用户操作,比如用于日志记录或宏命令录制。
  • 实现对请求的排队或优先级控制。

二、命令模式的结构

  1. Command: 抽象命令类,声明执行方法(execute())的接口。
  2. Concrete Command: 具体命令类,实现了抽象命令类的接口,知道如何调用接收者的具体方法来完成请求。
  3. Receiver: 接收者类,真正执行命令的对象,实现业务逻辑。
  4. Invoker: 调用者类,持有命令对象,并通过调用命令对象的 execute() 方法来执行命令。

三、C++ 示例

下面是一个简单的命令模式实现,我们将创建一个开关灯泡的场景,其中Light是接收者,SwitchOnCommand和SwitchOffCommand是具体的命令,RemoteControl是调用者。

#include <iostream> #include <vector> // 接收者角色:灯泡 class Light { public: void turnOn() { std::cout << "The light is turned on.\n"; } void turnOff() { std::cout << "The light is turned off.\n"; } }; // 抽象命令角色 class Command { public: virtual ~Command() {} virtual void execute() = 0; }; // 具体命令角色:开灯命令 class SwitchOnCommand : public Command { private: Light& light; public: SwitchOnCommand(Light& l) : light(l) {} void execute() override { light.turnOn(); } }; // 具体命令角色:关灯命令 class SwitchOffCommand : public Command { private: Light& light; public: SwitchOffCommand(Light& l) : light(l) {} void execute() override { light.turnOff(); } }; // 调用者角色:遥控器 class RemoteControl { private: std::vector<Command*> commands; public: // 添加命令 void setCommand(int slot, Command* cmd) { commands[slot] = cmd; } // 执行指定位置的命令 void pressButton(int slot) { if (slot >= 0 && slot < commands.size() && commands[slot] != nullptr) { commands[slot]->execute(); } else { std::cout << "Invalid button slot.\n"; } } // 清理资源,避免内存泄漏 ~RemoteControl() { for (auto cmd : commands) { delete cmd; } } }; int main() { Light light; // 创建命令对象 SwitchOnCommand onCmd(light); SwitchOffCommand offCmd(light); // 创建并配置遥控器 RemoteControl remote(2); // 假设遥控器有两个按钮槽位 remote.setCommand(0, &onCmd); remote.setCommand(1, &offCmd); // 模拟按下按钮 remote.pressButton(0); // 开灯 remote.pressButton(1); // 关灯 return 0; }

这个例子中,遥控器(RemoteControl)持有一组命令对象,并可以根据用户的按键选择执行相应的命令。命令对象负责与接收者(灯泡 Light)交互,从而达到解耦的目的。

结论

命令模式提供了一种灵活的方式来设计系统中的操作请求,增强了系统的可扩展性和灵活性。在实际项目中,可以根据需求定制命令对象以适应复杂的行为需求。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/165622.html

(0)
上一篇 2025-01-01 20:33
下一篇 2025-01-01 21:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信