程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 大話設計模式C++實現-第23章-命令模式

大話設計模式C++實現-第23章-命令模式

編輯:C++入門知識

大話設計模式C++實現-第23章-命令模式


一、UML圖

\

 

二、概念

命令模式(Command):將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化,對請求進行排隊或記錄請求日志,以及支持可撤銷的操作。

 

三、說明

角色:

(1)Command類:用來聲明執行操作的接口。

(2)ConcreteCommand類:將一個接收者對象綁定與一個動作,調用接收者相應的操作,以實現Excute。

(3)Invoker類:要求該命令執行這個請求。

(4)Receiver類:知道如何實施與執行一個與請求相關的操作,任何類都可能作為一個接收者。

命令模式的作用?

(1)命令模式能夠較容易地設計一個命令隊列。

(2)在需要的情況下,可以較容易地將命令記入日志。

(3)允許接收請求的一方決定是否要否決請求。

(4)可以容易地實現對請求的撤銷和重做。

(5)由於加進新的具體命令類不影響其他的類,因此增加新的具體命令類很容易。

(6)命令模式把請求一個操作的對象與知道怎麼執行一個操作的對象分隔開。

 

四、C++實現

(1)Command.h

 

#ifndef COMMAND_H
#define COMMAND_H

#include 
#include 
#include 
#include 

//Receiver:此處為烤羊肉串者
class Barbecuer
{
public:
	void BakeMutton()
	{
		std::cout<<"烤羊肉串!"<receiver=receiver;
	}
	virtual void ExcuteCommand()=0;
};

//ConcreteCommand類,具體命令
class BakeMuttonCommand:public Command
{
public:
	BakeMuttonCommand(Barbecuer* receiver):Command(receiver){}
	void ExcuteCommand()
	{
		receiver->BakeMutton();
	}
};

//ConcreteCommand類,具體命令
class BakeChickenWingCommand:public Command
{
public:
	BakeChickenWingCommand(Barbecuer* receiver):Command(receiver){}
	void ExcuteCommand()
	{
		receiver->BakeChickenWing();
	}
};

//Invoker:此處為Waiter服務員
class Waiter
{
private:
	std::vector *orders;
public:
	Waiter()
	{
		orders=new std::vector;
	}
	~Waiter()
	{
		delete orders;
	}
	
	//設置訂單
	void SetOrder(Command* command)
	{
		//判斷命令的類型並分別做不同的處理
		if(typeid(*command)==typeid(BakeChickenWingCommand))
		{
			std::cout<<"日志:服務員:雞翅沒有了,請點別的燒烤!"<push_back(command);
			
			time_t now=time(0);
			std::cout<<"日志:增加訂單:命令模式.烤羊肉串  "<<"時間:"<::iterator it;
		for(it=orders->begin();it!=orders->end();it++)
		{
			(*it)->ExcuteCommand();
		}
	}
};




#endif


 

 

(2)Client.cpp

 

#include "Command.h"
#include 
#include 

void main()
{
	//開店前的准備
	Barbecuer* boy=new Barbecuer();

	Command* bakeMuttonCommand1=new BakeMuttonCommand(boy);
	Command* bakeMuttonCommand2=new BakeMuttonCommand(boy);
	Command* bakeChickenWingCommand1=new BakeChickenWingCommand(boy);

	Waiter* girl=new Waiter();

	//開門營業,顧客點菜
	girl->SetOrder(bakeMuttonCommand1);
	girl->SetOrder(bakeMuttonCommand2);
	girl->SetOrder(bakeChickenWingCommand1);

	//點菜完畢,通知廚房
	girl->Notify();

	delete boy,bakeMuttonCommand1,bakeMuttonCommand2,bakeChickenWingCommand1;
	system("pause");
}


 

(3)運行截圖

\

上一篇http://www.Bkjia.com/kf/201412/364153.html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved