本文主要是介绍设计模式——职责链模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
职责链模式(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 处理请求
这篇关于设计模式——职责链模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!