资讯详情

设计模式23——命令模式

📅 2026/10/22 1:13:57 | 华诺云谱 👁 阅读
设计模式23——命令模式
动机在软件构建过程中“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合——比如需要对行为进行“记录、撤销/重做undo/redo、事务”等处理这种无法抵御变化的紧耦合就显得不合时宜了。例如当我们把“用户点击按钮”和“按钮需要执行的业务逻辑”直接写死在一起时如果后续想加入日志记录、撤销操作或把一组动作组合起来执行代码就会变得越来越难改。命令模式正是为了解决这类问题而出现的。模式定义命令模式把“一个动作”抽象成一个对象调用方只关心“执行”这个接口而不需要关心动作的具体内容。模式结构命令模式包含以下核心角色角色作用Command命令接口通常有execute()ConcreteCommand具体命令持有接收者并调用它的操作Receiver真正干活的对象Invoker调用者只负责触发命令不关心具体实现案例用 C 实现命令模式#includeiostream#includememoryclassCommand{public:virtual~Command()default;virtualvoidexecute()0;virtualvoidundo(){}};classLight{public:voidon(){std::coutLight on\n;}voidoff(){std::coutLight off\n;}};classLightOnCommand:publicCommand{public:explicitLightOnCommand(Lightlight):light_(light){}voidexecute()override{light_.on();}voidundo()override{light_.off();}private:Lightlight_;};classRemoteControl{public:voidsetCommand(std::unique_ptrCommandcmd){command_std::move(cmd);}voidpress(){if(command_)command_-execute();}voidundo(){if(command_)command_-undo();}private:std::unique_ptrCommandcommand_;};intmain(){Light light;RemoteControl remote;remote.setCommand(std::make_uniqueLightOnCommand(light));remote.press();remote.undo();}总结命令模式本质上是把“调用哪个函数”变成“操作一个命令对象”所以它可以被存储、传递、排队、回放和撤销。它适合做什么撤销 / 重做编辑器、绘图软件、CAD 常用。命令队列任务调度、消息队列、游戏输入缓冲。日志 / 宏命令记录操作历史或一次性执行一组命令。解耦调用者和执行者按钮、遥控器、菜单项不需要知道具体怎么执行。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑