责任链模式使多个对象都有机会去处理请求,从而避免接收者和发送者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。
责任链上的对像只要满足处理条件都可以对请求进行处理,如果不满足,则将此请求传递给链上的下一个对像。
Handler: 责任链基类,定义具体接口。
ConcreteHandlerOne: 责任链上的一个具体对象,可以处理请求,也可以把请求传递给下一个对象。
ConcreteHandlerTwo: 责任链上的一个另一个具体对象,可以处理请求,也可以把请求传递给下一个对象。
代码示例
class Handler
{
protected:
weak_ptr<Handler> m_nexthandler;
public:
virtual ~Handler(){};
virtual void HandlRequest(int nrequest) = 0;
virtual void SetNextHandler(shared_ptr<Handler> phandler) = 0;
virtual weak_ptr<Handler> GetNextHanlder() = 0;
};
class ConcreteHandlerOne : public Handler
{
private:
weak_ptr<Handler> m_nexthandler;
public:
void HandlRequest(int nrequest)
{
if(nrequest> 10)
{
std::cout<<"ConcreteHandlerOne deal this requestion:"<<nrequest<<std::endl;
}
if(!m_nexthandler.expired())
{
std::cout<<"ConcreteHandlerOne cannot deal this requestion, pass the Next!!"<<std::endl;
m_nexthandler.lock()->HandlRequest(nrequest);
}
}
void SetNextHandler(shared_ptr<Handler> phandler)
{
this->m_nexthandler = phandler;
}
weak_ptr<Handler> GetNextHanlder()
{
return m_nexthandler;
}
};
class ConcreteHandlerTwo : public Handler
{
private:
weak_ptr<Handler> m_nexthandler;
public:
void HandlRequest(int nrequest)
{
if(nrequest> 20)
{
std::cout<<"ConcreteHandlerTwo deal this requestion:"<<nrequest<<std::endl;
}
if(!m_nexthandler.expired())
{
std::cout<<"ConcreteHandlerTwo cannot deal this requestion, pass the Next!!"<<std::endl;
m_nexthandler.lock()->HandlRequest(nrequest);
}
}
void SetNextHandler(shared_ptr<Handler> phandler)
{
this->m_nexthandler = phandler;
}
weak_ptr<Handler> GetNextHanlder()
{
return m_nexthandler;
}
};
测试代码
int main()
{
shared_ptr<Handler> phandlerOne = make_shared<ConcreteHandlerOne>();
shared_ptr<Handler> phandlerTwo = make_shared<ConcreteHandlerTwo>();
//设置下一个处理对象节点
phandlerOne.get()->SetNextHandler(phandlerTwo);
phandlerOne->HandlRequest(10);
phandlerOne->HandlRequest(25);
phandlerTwo->HandlRequest(100);
return 0;
}
责任链模式不能保证求请求一定被接收,其中一格对象没有后继对象会造成循环调用。责任链一般会与建造者或者策略模式结合,通过设定一定的条件的处理相应的请求。责任链是很灵活的,根据需要也可以写成有前继对象的情况。不过要注意防止循环调用。