C++ command model 命令模式

命令模式:將來自客戶端的命令請求封裝成對象。

在客戶端和提供服務的服務端增加了一層中間層。 invoker

invoker 負責 1:將來自客戶端的命令封裝成對象(SetCmd);

 2:負責調用提供服務的服務端提供的方法,來響應客戶端的命令請求

#include <iostream>
#include <vector>

using namespace std;

//鍘ㄥ笀綾?鎻愪緵鍝嶅簲鍛戒護鐨勬柟娉?class Cooker
{
    public:
        void CookFish()
        {
            cout<<"cook fish"<<endl;
        }

        void CookMeat()
        {
            cout<<"cook meat"<<endl;
        }
};

//鎶借薄command 綾?class Command
{
    public:
       Command(Cooker *cook):m_pCook(cook){}
       virtual void ExecuteCmd()= 0; 

    protected:
        Cooker *m_pCook;
};


class CookFishCmd: public Command
{
    public:
        CookFishCmd(Cooker *cook):Command(cook){}
        void ExecuteCmd()
        {
            m_pCook->CookFish();
        }
};

class CookMeatCmd: public Command
{
    public:
        CookMeatCmd(Cooker *cook):Command(cook){}
        void ExecuteCmd()
        {   
            m_pCook->CookMeat();
        }
    
};


class Waiter
{
    public:
        void SetCmd(Command *cmd);
        void Notify();
    private:
        vector<Command*>vecCmd;
};

void Waiter::SetCmd(Command *cmd)
{
        vecCmd.push_back(cmd);
        cout<<"add_order"<<endl;
}

void Waiter::Notify()
{
    vector<Command*>::iterator iter;
    for(iter= vecCmd.begin(); iter != vecCmd.end(); iter++)
    {
        (*iter)->ExecuteCmd();
    }
}




int main()
{
    Cooker *cook = new Cooker();
    CookFishCmd *cfishCmd = new CookFishCmd(cook);
    CookMeatCmd *cmeatCmd = new CookMeatCmd(cook);


   Waiter *girl = new Waiter();
   girl->SetCmd(cfishCmd);
   girl->SetCmd(cmeatCmd);

   girl->Notify();

   return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章