责任链模式(Chain of Responsibility):
使多个对象都有机会处理请求,从而避免请求的开发者和接收者之前的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
责任链模式的好处:
当客户提交一个请求的时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。
结果是职责链可简化对象的相互连接,它们仅需要保持一个指向其后继者的引用,而不需要保持它所有的后选择接收者的引用。
可以随时地增加或者修改一个请求的结构。
增强了给对象指派职责的灵活性。
一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理。职责链代码:
#pragma once
#include <iostream>
using namespace std;
//Handler类,定义一个处理请求的接口
class CHandler
{
protected:
CHandler *m_pSuccessor;
public:
CHandler(){m_pSuccessor = NULL;}
void SetSuccessor(CHandler *pSuccessor)
{
m_pSuccessor = pSuccessor;
}
virtual void HandleRequest(const int &nRequest) = 0;
};
//ConcreteHandler类,具体处理者类,处理它所负责的请求,可访问它的后继者,
//如果可处理该请求,就处理之,否则就将该请求转发给它的后继者。
//ConcreteHandler1,当请求数在0到10之间则有权利处理,否则转到下一位。
class CConcreteHandler1 : public CHandler
{
public:
void HandleRequest(const int &nRequest)
{
if(nRequest >= 0 && nRequest < 10)
{
cout<<"CConcreteHandler1:"<<nRequest<<endl;
}
else if(m_pSuccessor != NULL)
{
m_pSuccessor->HandleRequest(nRequest);
}
}
};
//ConcreteHandler2,10-20。
class CConcreteHandler2 : public CHandler
{
public:
void HandleRequest(const int &nRequest)
{
if(nRequest >= 10 && nRequest < 20)
{
cout<<"CConcreteHandler2:"<<nRequest<<endl;
}
else if(m_pSuccessor != NULL)
{
m_pSuccessor->HandleRequest(nRequest);
}
}
};
客户端使用代码:
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include "ChainOfResponsibilityMode.h"
using namespace std;
int main()
{
CHandler *pH1 = new CConcreteHandler1();
CHandler *pH2 = new CConcreteHandler2();
pH1->SetSuccessor(pH2);
for(int i = 5 ;i <= 15 ;i ++)
{
pH1->HandleRequest(i);
}
delete pH1;
delete pH2;
return 0;
}
运行结果:
和状态模式相比,它的条件可以相关,也可以所有都不相关;与组合模式相比,组合模式是有树形结构的,也就是是有等级关系的,而职责链模式则是一条线,没有什么结构。