GreensnoWorld
记录点滴,分享乐趣,一块凝固的时间
2012.职责链模式
设计模式  2023年9月26日
#include <iostream>
using namespace std;

#define SAFE_DELETE(p) if(p){delete p; p=NULL;}

class HolidayRequest
{
public:
	HolidayRequest(int hour): m_iHour(hour){}
	int GetHour() {return m_iHour;}
private:
	int m_iHour;
};

class Manager
{
public:
	virtual bool HandleRequest(HolidayRequest *pRequest)=0;
};

class PM: public Manager
{
public:
	PM(Manager *handler): m_pHandler(handler){}
	bool HandleRequest(HolidayRequest *pRequest)
	{
		if(pRequest->GetHour()<=2 || m_pHandler==NULL)
		{
			cout << "PM said: OK." << endl;
			return true;
		}
		return m_pHandler->HandleRequest(pRequest);
	}
private:
	Manager *m_pHandler;
};

class DM: public Manager
{
public:
	DM(Manager *handler): m_pHandler(handler){}
	bool HandleRequest(HolidayRequest *pRequest)
	{
		cout << "DM said: OK." << endl;
		return true;
	}

	bool IsIn()
	{
		return true;
	}
private:
	Manager *m_pHandler;
};

class PS: public Manager
{
public:
	PS(Manager *handler): m_pHandler(handler){}
	bool HandleRequest(HolidayRequest *pRequest)
	{
		DM *pDM = dynamic_cast<DM *>(m_pHandler);
		if(pDM != NULL)
		{
			if(pDM->IsIn())
			{
				return pDM->HandleRequest(pRequest);
			}
		}
		cout << "PS said: OK." << endl;
		return true;
	}
private:
	Manager *m_pHandler;
};

int main()
{
	DM *pDM = new DM(NULL);
	PS *pPS = new PS(pDM);
	PM *pPM = new PM(pPS);
	HolidayRequest *pHolidayRequest = new HolidayRequest(10);
	pPM->HandleRequest(pHolidayRequest);
	SAFE_DELETE(pHolidayRequest);

	pHolidayRequest = new HolidayRequest(2);
	pPM->HandleRequest(pHolidayRequest);

	SAFE_DELETE(pDM);
	SAFE_DELETE(pPS);
	SAFE_DELETE(pPM);
	SAFE_DELETE(pHolidayRequest);
}

 

LIJG
余本顽劣,生于紫云下,长于汝水滨。早年求学,兴趣广泛,好高骛远,学无所成,仓皇入世。兴趣所致,投身互联网,求知未证,而立已至,始悟光阴荏苒,终需务实钻研。故有此站,记录时光,积累点滴,验证所学,分享愚见。指舞方寸间,心系万千年。
留言