设计模式之命令模式-要听话!
一、命令模式的概念
命令模式是一种数据驱动的设计模式,属于行为型模式;请求以命令的形式包裹在对象中,并传递给调用对象;调用对象寻找可以处理该命令的合适对象,并把该命令传给相应的对象,该对象执行命令。
二、命令模式使用场景
1、命令模式是将一个请求封装为一个对象,从而可用不同的请求对客户端进行参数化、对请
求排队或记录请求日志、支持可撤销的操作等等。
三、命令模式构建方法
1、命令抽象类(Command)
命令抽象父类给具体实现类提供统一的共同接口和方法。
2、命令具体实现类(ConcreteCommand)
命令具体实现类继承抽象父类,用于实现抽象父类中的共同接口和方法。
3、接收者类(Receiver)
需要被调用的目标对象类
4、命令对象入口类或者调用者类(Invorker)
通过命令对象入口类来执行命令对象
四、命令模式的示例
// CommandPattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream> #include <string> using namespace std; #define DELETE_PTR(p) {if(p!=nullptr){delete (p); (p)=nullptr;}} namespace TYPES { enum COMMANDTYPE { EXPRESS, // 取快递 WASH, // 洗碗 COOK // 做饭 }; } // 丈夫是接收者-TOBY class Husband { public: void setCommand(TYPES::COMMANDTYPE commandType) // 丈夫的话形同“虚”设,还要看媳妇脸色 { switch (commandType) { case TYPES::EXPRESS: cout << "Toby去取快递。。。" << endl; break; case TYPES::WASH: cout << "Toby去洗碗。。。" << endl; break; case TYPES::COOK: cout << "Toby去做饭。。。" << endl; break; default: cout << "任性一回,不想做。" << endl; break; } } }; // 命令抽象类 class Command { public: virtual void executeCommand() = 0; private: }; // 命令具体类-取快递 class ExpressCommand : public Command { public: ExpressCommand(Husband *pHusband) { m_pHusband = pHusband; } virtual void executeCommand() { m_pHusband->setCommand(TYPES::COMMANDTYPE::EXPRESS); } private: Husband *m_pHusband; }; // 命令具体类-洗碗 class WashCommand : public Command { public: WashCommand(Husband *pHusband) { m_pHusband = pHusband; } virtual void executeCommand() { m_pHusband->setCommand(TYPES::COMMANDTYPE::WASH); } private: Husband *m_pHusband; }; // 命令具体类-做饭 class CookCommand : public Command { public: CookCommand(Husband *pHusband) { m_pHusband = pHusband; } virtual void executeCommand() { m_pHusband->setCommand(TYPES::COMMANDTYPE::COOK); } private: Husband *m_pHusband; }; // 媳妇是命令发送者 class Wife { public: void setCommand(Command *pCommand) { m_pCommand = pCommand; if (pCommand != nullptr) { m_pCommand->executeCommand(); } return; } private: Command *m_pCommand; }; int main() { cout << "----------命令行模式----------" << endl; Husband *pHusband = new Husband; ExpressCommand *pExpressCommand = new ExpressCommand(pHusband); WashCommand *pWashCommand = new WashCommand(pHusband); CookCommand *pCookCommand = new CookCommand(pHusband); Wife *pWife = new Wife; pWife->setCommand(pExpressCommand); pWife->setCommand(pWashCommand); pWife->setCommand(pCookCommand); DELETE_PTR(pWife); DELETE_PTR(pExpressCommand); DELETE_PTR(pWashCommand); DELETE_PTR(pCookCommand); DELETE_PTR(pHusband); std::cout << "Hello World!\n"; getchar(); }
运行结果:
五、命令模式的优缺点
优点:
1、命令模式降低了系统耦合度。
2、可以很容易把新命令添加到系统中。
缺点:
1、使用命令模式可能会导致系统中出现很多的具体命令类。
原文:https://blog.csdn.net/toby54king/article/details/104504777
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏