디자인 모드 의 명령 모드 (Command)

2813 단어 명령 모드
명령 모드 (Command) 는 요청 을 대상 으로 밀봉 하여 더 많은 정 보 를 저장 할 수 있 도록 합 니 다.명령 모드 역시 요청 한 발송 자 와 수신 자 를 결합 시 킬 수 있 지만 요청 이 어떤 방식 으로 처 리 될 지 는 관심 이 없습니다.명령 모드 는 직책 체인 모드 (Chain of Responsibility) 와 조합 모드 (Composite) 와 함께 자주 사용 합 니 다. 직책 체인 모드 처리 명령 모드 로 포 장 된 대상, 조합 모드 는 간단 한 명령 대상 을 복잡 한 명령 대상 으로 조합 할 수 있 습 니 다.
      본 고 는 식당 에서 주문 한 예 를 들 었 다.(1) 불고기 사 부 는 백 스테이지 (주방) 에서 요 리 를 책임 진다.(2) Command 는 메뉴 에 해당 하 는 각종 명령 을 제공 합 니 다.(3) 종업원 은 고객 과 접촉 하여 고객 이 어떤 요 리 를 시 켰 는 지 기록 하고 요리사 에 게 맡 깁 니 다.(4) 고객 은 주문 을 책임 진다.
코드:
#include <iostream>
#include <vector>
#include <string>
using namespace std;


class Command;
class MakeChikenCmd;
class MakeMuttonCmd;
//    
class RoastCook{ 
	friend class MakeChikenCmd;
	friend class MakeMuttonCmd;
private:
	void MakeMutton() 
	{ cout << "   "; }
	void MakeChickenWing() 
	{ cout << "    "; }
};

//     ,   
class Command{
public:
	Command(RoastCook* cook)
	{
		cooker = cook;
	}
    virtual ~Command(){}
	virtual void Execute()=0;
protected:
	RoastCook *cooker;//          
};

//     
class MakeMuttonCmd : public Command{
public:
	MakeMuttonCmd(RoastCook *cook):Command(cook){}
	void Execute()
	{
		cooker->MakeMutton();
	}
};
//     
class MakeChikenCmd : public Command{
public:
	MakeChikenCmd(RoastCook *cook):Command(cook){}
	void Execute()
	{
		cooker->MakeChickenWing();
	}
};

//    ,       
class Waiter{
public:
	Waiter(string _name)
	{this->name = _name;}
	void AddOder(Command* subOder)//       
	{
		oder.push_back(subOder);
	}

	void Notify()
	{
		vector<Command*>::iterator iter;
		cout<<name<<"         :"<<endl;
		for(iter = oder.begin();iter!=oder.end();++iter){
			cout<<"                   ";
			(*iter)->Execute();
			cout<<endl;
		}
	}

	string getName()const
	{return name;}
private:
	vector<Command*> oder;//   
	string name;//     
};

class Custmer{
public:
	Custmer(string myname)
	{
		this->name = myname;
		this->w = NULL;
	}

	void CustmerOder(Command *cmd)
	{
		cout<<"  "<<name<<"  "<<endl;
		w->AddOder(cmd);
	}

	void CallWaiter(Waiter *_w)
	{
	    cout<<"  "<<name<<"     "<<endl;
		this->w = _w;
		cout<<"   "<<w->getName()<<"    "<<endl;
	}
private:
	string name;
	Waiter *w;
};

int main()
{
	RoastCook *cooker = new RoastCook();
	Command *cmd = new MakeChikenCmd(cooker);
	Command *cmd1 = new MakeMuttonCmd(cooker);

    Waiter waiter("sps");
	Custmer cust("lsj");
    cust.CallWaiter(&waiter);//     

	cust.CustmerOder(cmd);//  
	cust.CustmerOder(cmd1);//  

	waiter.Notify();//       

	system("pause");
	return 0;
}

좋은 웹페이지 즐겨찾기