资讯动态

设计模式23——命令模式

发布时间:2026/10/22 1:13:54 来源:尧图企业网站定制
动机在软件构建过程中“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合——比如需要对行为进行“记录、撤销/重做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 常用。命令队列任务调度、消息队列、游戏输入缓冲。日志 / 宏命令记录操作历史或一次性执行一组命令。解耦调用者和执行者按钮、遥控器、菜单项不需要知道具体怎么执行。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑