职责链模式(Chain of Responsibility)
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连接成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
发出请求的客户端并不知道职责链中哪一个对象处理了请求,这样就可以实现在不影响客户端的情况下动态地重新组织和分配任务。
代码如下
#include <iostream>
#include <string>
#include <vector>
using namespace std;
// Handler类,定义一个处理请示的接口
class Handler{
public:
// 设置继任者
void SetSuccessor(Handler *successor){
successor_ = successor;
}
// 处理请求的抽象方法
virtual void HandleRequest(int request) = 0;
protected:
Handler *successor_;
};
// ConcreteHandler1类, 当请求数在0到10之间则有权处理,否则转到下一位
class ConcreteHandler1 : public Handler{
public:
void HandleRequest(int request) override{
if(request>=0 && request<10){
cout << "ConcreteHandler1 处理请求" << endl;
}
else if(successor_ != nullptr){
// 转移到下一位
successor_->HandleRequest(request);
}
}
};
// ConcreteHandler1类, 当请求数在10到20之间则有权处理,否则转到下一位
class ConcreteHandler2 : public Handler{
public:
void HandleRequest(int request) override{
if(request>=10 && request<20){
cout << "ConcreteHandler2 处理请求" << endl;
}
else if(successor_ != nullptr){
// 转移到下一位
successor_->HandleRequest(request);
}
}
};
// ConcreteHandler3类, 当请求数在20到30之间则有权处理,否则转到下一位
class ConcreteHandler3 : public Handler{
public:
void HandleRequest(int request) override{
if(request>=20 && request<30){
cout << "ConcreteHandler3 处理请求" << endl;
}
else if(successor_ != nullptr){
// 转移到下一位
successor_->HandleRequest(request);
}
}
};
// 客户端代码,向链上的具体处理者对象提交请求
void Client(){
Handler *h1 = new ConcreteHandler1();
Handler *h2 = new ConcreteHandler2();
Handler *h3 = new ConcreteHandler3();
h1->SetSuccessor(h2);
h2->SetSuccessor(h3);
vector<int> request = {2, 5, 14, 22, 18, 3, 27, 20};
for(int a:request){
h1->HandleRequest(a);
}
}
int main(){
Client();
return 0;
}
输出为
ConcreteHandler1 处理请求
ConcreteHandler1 处理请求
ConcreteHandler2 处理请求
ConcreteHandler3 处理请求
ConcreteHandler2 处理请求
ConcreteHandler1 处理请求
ConcreteHandler3 处理请求
ConcreteHandler3 处理请求