职责链模式
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止。
本文讲解职责链模式框架,代码使用C++语言描述,代码存在的不足或问题有望各位指出。
职责链模式框架
#include <iostream>
#include <vector>
using namespace std;
class Handler
{
public:
Handler(){}
virtual ~Handler(){}
void setSuccessor(Handler *successor)
{
this->successor = successor;
}
virtual void HandleRequest(int request) =0;
protected:
Handler *successor = nullptr;
};
class ConcreteHandler1: public Handler
{
public:
void HandleRequest(int request) override
{
if(request >=0 && request <10)
{
cout <<"ConcreteHandler1"<<"处理请求"<<request<<endl;
}
else if(successor != nullptr)
{
successor->HandleRequest(request);
}
}
};
class ConcreteHandler2: public Handler
{
public:
void HandleRequest(int request) override
{
if(request >=10 && request <20)
{
cout << "ConcreteHandler2" << "处理请求" << request <<endl;
}
else if(successor != nullptr)
{
successor->HandleRequest(request);
}
}
};
class ConcreteHandler3: public Handler
{
public:
void HandleRequest(int request) override
{
if(request >=20 && request <=30)
{
cout << "ConcreteHandler3" << "处理请求"<< request <<endl;
}
else if(successor !=nullptr)
{
successor->HandleRequest(request);
}
}
};
int main()
{
Handler *h1 = new ConcreteHandler1();
Handler *h2 = new ConcreteHandler2();
Handler *h3 = new ConcreteHandler3();
h1->setSuccessor(h2);
h2->setSuccessor(h3);
vector<int>requests{2,5,14,22,18,3,27,20};
for(auto output:requests)
{
h1->HandleRequest(output);
}
delete h1;
delete h2;
delete h3;
return 0;
}
职责链的好处
1、当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。
2、接收者和发送者都没有对象的明确信息,且链中的对象自己也并不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选接受者的引用。
3、随时增加或修改处理一个请求的结构。增强了给对象指派职责的灵活性。