C++实现命令模式

 

刚刚看了一遍关于命令模式的博文, 这里简单实现一下。

命令模式实际上就是把请求一个操作的对象与实际知道怎么操行一个操作的对象分开

现实生活中有很多这样的场景。 如下小例:

 

代码如下:

#include <iostream>
using namespace std;

#include <vector>

/*
场景需求分析:  去烧烤店吃烧烤
烤肉师傅(Barbucer): 会烤羊肉  会烤鸡翅  会烤...
服务员(Waiter):      接收 客户 的点菜指令  告诉烤肉师傅要烤什么 烤肉师傅执行指令

类似场景可以用命令模式分析:
class Barbucer:  有方法: 烤肉  烤鸡翅等
class Waiter:     有方法: 接收客户的指令(有命令列表)并告诉烤肉师傅(保存烤肉师傅对象指针)执行(其实是烤肉师傅接收命令执行)
客户发送命令, 有不同的命令,抽象出命令抽象类  具体实现如下
*/


//烤肉师傅类
class Barbucer
{
   public:
     void MakeMutton(){ cout<<"烤肉师傅开始烤羊肉..."<<endl;}
     void MakeChickenWing(){ cout<<"烤肉师傅开始烤鸡翅..."<<endl;}
};


//命令的抽象类
class Command
{
   public:
     Command(Barbucer *temp){ receiver = temp; }
     virtual void ExecuteCmd() = 0;
   protected:
     Barbucer *receiver;
};

class MakeMuttonCmd:public Command
{
   public:
      MakeMuttonCmd(Barbucer *temp):Command(temp){} //注意这里 显示的调用父类的有参构造函数来构造自己
      virtual void ExecuteCmd(){
          receiver->MakeMutton();
      }
};

class MakeChickenWingCmd:public Command
{
   public:
      MakeChickenWingCmd(Barbucer *temp):Command(temp){}
      virtual void ExecuteCmd(){
          receiver->MakeChickenWing();
      }
};

//服务员类
class Waiter
{
   public:
     void setCmd(Command *temp){
        cmd_list.push_back(temp);
        cout<<"服务员接到点菜命令..."<<endl;
     }
     void notify()
     {
        cout<<"服务员发送命令给烤肉师傅..."<<endl;
        vector<Command*>::iterator iter = cmd_list.begin();
        for(; iter != cmd_list.end(); ++iter){
            (*iter)->ExecuteCmd();
        }
     }
   protected:
     vector<Command*> cmd_list;
};

int main(void)
{
   //实例化出一个烤肉师傅
   Barbucer *barbucer = new Barbucer;
   //实例化处一个服务员
   Waiter *waiter = new Waiter;

   Command *makemuttoncmd = new MakeMuttonCmd(barbucer); //烤羊肉命令
   Command *makechickenwingcmd = new MakeChickenWingCmd(barbucer); //烤鸡翅命令

   //服务员接收到命令
   waiter->setCmd(makemuttoncmd);
   waiter->setCmd(makechickenwingcmd);

   //服务员发送命令
   waiter->notify();
  
   return 0;
}

运行结果:

       

 

 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值