行为型模式
15) 命令模式
本文主要参考:
https://www.jianshu.com/p/0ae8582ff831
命令模式做为一种行为模式, 本质也是一种请求 - 响应模式. 将命令的调用和命令的执行分开.
在一些软件系统中, 行为的请求和实现往往是强耦合的, 但是这样就无法处理命令的记录, 撤销, 重做等操作. 例如 Word 中的撤销操作, 几乎所有的命令都能够被撤销.
通过将命令的调用和请求分别抽象成为一组操作, 就可以实现两者的弱耦合.
命令模式主要包括三个角色:
命令, 一般是抽象类, 定义各种不同的命令操作
命令的执行者
命令的调用者
例如在餐厅点餐, 有什么需要只要跟服务员说就好了, 不需要直接跟做菜的人说.
- // 烤肉师傅, 命令执行者
- class BarbecueMaster{
- public:
- void makemutton(){
- cout<<"making mutton"<<endl;
- }
- void makechicken(){
- cout<<"making chicken"<<endl;
- }
- };
- // 命令类
- class Command{
- protected:
- BarbecueMaster* p_master;
- public:
- Command(BarbecueMaster* p):p_master(p){}
- // 命令的执行
- virtual void ExecuteCommand()=0;
- };
- class CommandMutton : public Command{
- public:
- CommandMutton(BarbecueMaster* p):Command(p){}
- void ExecuteCommand(){
- p_master->makemutton();
- }
- };
- class CommandChicken:public Command{
- public:
- CommandChicken(BarbecueMaster* p):Command(p){}
- void ExecuteCommand(){
- p_master->makechicken();
- }
- };
- // 服务员, 命令调用者
- class Waiter{
- private:
- vector<Command*> m_vec;
- public:
- void add(Command* p){
- m_vec.push_back(p);
- }
- void submitCmd(){
- for(auto it=m_vec.begin();it!=m_vec.end();it++){
- (*it)->ExecuteCommand();
- }
- }
- };
- int main()
- {
- Waiter* pwaiter = new Waiter();
- BarbecueMaster* pMaster = new BarbecueMaster();
- pwaiter->add(new CommandMutton(pMaster));
- pwaiter->add(new CommandChicken(pMaster));
- pwaiter->submitCmd();
- }
运行结果:
来源: http://www.bubuko.com/infodetail-3335328.html