ConcreteHandler:处理它所负责的请求,如果可处理该请求,就处理掉这个请求;否则将该请求转发给它的下一个可以处理该请求的对象,所以它必须能访问它的下一个可以处理同样请求的对象;
Client:向处理对象提出具体的请求。
当客户提交一个请求时,请求沿着一条链传递,直至有一个ConcreteHandler对象负责处理它。
使用场合
1.有多个的对象可以处理一个请求,由哪个对象处理该请求是在运行时刻自动确定的;
2.如果想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求;
3.可以处理一个请求的对象集合应被动态指定。
代码实现
复制代码
#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;
};
// The holiday request handler interface
class Manager
{
public:
virtual bool HandleRequest(HolidayRequest *pRequest) = 0;
};
// Project manager
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;
};
// Department manager
class DM : public Manager
{
public:
DM(Manager *handler) : m_pHandler(handler){}
bool HandleRequest(HolidayRequest *pRequest)
{
cout<<"DM said:OK."<<endl;










