head File
//ChainOfResponsibilityPattern.h #ifndef CHAIN_OF_RESPONSIBILITY_PATTERN_H #define CHAIN_OF_RESPONSIBILITY_PATTERN_H #include <Windows.h> #include <iostream> using namespace std; #define SAFE_DELETE(p) if (p) { delete p; p = NULL; } namespace ChainOfResponsibilityPattern { ////////////////////////////////////////////////////////////////////////// class HolidayRequest { public: HolidayRequest(int hour); int GetHour(); private: int m_iHour; }; //The holiday request handler interface class Manager { public: Manager(); virtual ~Manager(); virtual bool HandleRequest(HolidayRequest* pRequest) = 0; }; // Project manager class PM : public Manager { public: PM(Manager *handler); virtual ~PM(); bool HandleRequest(HolidayRequest* pRequest); private: Manager * m_pHandler; }; // Department manager class DM : public Manager { public: DM(Manager *handler); virtual ~DM(); bool HandleRequest(HolidayRequest* pRequest); // The department manager is in? bool IsIn(); private: Manager * m_pHandler; }; // Project supervisor class PS : public Manager { public: PS(Manager *handler); virtual ~PS(); bool HandleRequest(HolidayRequest* pRequest); private: Manager * m_pHandler; }; ////////////////////////////////////////////////////////////////////////// void ChainOfResponsibilityPattern_Test(); } #endif
accomplish
#include "ChainOfResponsibilityPattern.h" namespace ChainOfResponsibilityPattern { ////////////////////////////////////////////////////////////////////////// HolidayRequest::HolidayRequest(int hour) : m_iHour(hour) {} int HolidayRequest::GetHour() { return m_iHour; } ////////////////////////////////////////////////////////////////////////// Manager::Manager(){} Manager::~Manager(){} ////////////////////////////////////////////////////////////////////////// PM::PM(Manager *handler) : m_pHandler (handler) {} PM :: ~ PM () {} bool PM::HandleRequest(HolidayRequest *pRequest) { if (pRequest->GetHour() <= 2 || m_pHandler == NULL) { cout<<"PM said:OK, it's Over!"<<endl; return true; } else { cout<<"PM said:OK, transfer to next Manager."<<endl; return m_pHandler->HandleRequest(pRequest); } } // Department manager ////////////////////////////////////////////////////////////////////////// DM::DM(Manager *handler) : m_pHandler (handler) {} DM::~DM() {} bool DM::HandleRequest(HolidayRequest *pRequest) { cout<<"DM said:OK, it's Over!"<<endl; return true; } // The department manager is in? bool DM::IsIn() { return true; } // Project supervisor ////////////////////////////////////////////////////////////////////////// PS :: PS (Manager * handler) : m_pHandler (handler) {} PS::~PS() {} bool PS::HandleRequest(HolidayRequest *pRequest) { DM *pDM = dynamic_cast<DM *>(m_pHandler); if (pDM != NULL) { if (pDM->IsIn()) { return pDM->HandleRequest(pRequest); } } cout<<"PS said:OK, it's Over!"<<endl; return true; } ////////////////////////////////////////////////////////////////////////// void ChainOfResponsibilityPattern_Test() { 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); } }
client
#include "ChainOfResponsibilityPattern.h" #include <iostream> using namespace std; using namespace ChainOfResponsibilityPattern; void main() { ChainOfResponsibilityPattern_Test(); }
PM said:OK,transfer to next Manager. DM said:OK,it's Over! PM said:OK,it's Over!