23 【行为型】职责链模式 - Chain of Responsibility
职责链模式(chain of responsibility):
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。
将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止;
“这里发出这个请求的客户端并不知道这当中哪个对象最终处理请求,这样系统的更改可以在不影响客户端的情况下动态的重新组织和分配责任”
结构图:

代码实现:
/*
* @Description:
* @Remark: 设计模式之职责链模式
* @Author: whl
* @博客园: https://www.cnblogs.com/cnwhl/
* @Date: 2021-12-27 15:36:16
* @LastEditTime: 2021-12-28 17:46:02
*/
#include <iostream>
using namespace std;
/**
* @description: 抽象类
* @Remark: 设置下一个处理对象,并声明处理请求接口
*/
class Handler
{
public:
bool SetSuccsessor(Handler* successor){
if(successor == NULL){
return false;
}
m_pHandler = successor;
return true;
}
virtual void HandleRequest(int request) = 0;
protected:
Handler* m_pHandler;
};
/**
* @description: 具体实现类
* @Remark: 实现处理请求的具体功能,无法处理的交给下个处理人处理
*/
class ConcreteHandlerA: public Handler
{
public:
void HandleRequest(int request){
if(request > 0 && request <= 100){
cout << "handler A 可以处理" << endl;
}else if(m_pHandler){
m_pHandler->HandleRequest(request);
}
}
};
class ConcreteHandlerB: public Handler
{
void HandleRequest(int request){
if(request > 100 && request <= 500){
cout << "handler B 可以处理"<< endl;
}else if(m_pHandler){
m_pHandler->HandleRequest(request);
}
}
};
class ConcreteHandlerC: public Handler
{
void HandleRequest(int request){
if(request > 500 && request <= 1000){
cout << "handler C 可以处理"<< endl;
}else if(m_pHandler){
m_pHandler->HandleRequest(request);
}
}
};
int main()
{
ConcreteHandlerA* pA = new ConcreteHandlerA();
ConcreteHandlerB* pB = new ConcreteHandlerB();
ConcreteHandlerC* pC = new ConcreteHandlerC();
pA->SetSuccsessor(pB);
pB->SetSuccsessor(pC);
pC->SetSuccsessor(pA);
pA->HandleRequest(50);
pA->HandleRequest(200);
pA->HandleRequest(800);
return 0;
}实际应用场景:
1、学校OA系统采购审批项目
2、小菜请假/加薪
1. 职责链的特点是:当客户提交一个请求时,请求是沿链传递直至有一个Manager对象负责处理它。
2. 职责链的好处是:请求者不用管哪个对象来处理,反正该请求会被处理。它只需保持一个后继者即可。
3. 要注意的是:一个请求到链的最后可能也没有处理,所以一定要配置得当。
注意事项及使用细节:
1、将请求和处理分开,实现解耦,提高系统的灵活性;
2、简化了对象:使对象不需要知道链的结构;
3、性能会受到影响,特别是在链比较长的时候,因此需要控制链表中的最大节点数量;
4、调试不方便,采用类似递归的方式,调试时逻辑可能比较复杂;
5、最佳应用场景:
有多个对象可以处理一个请求是,比如多级请求,请假/加薪等审批流程,拦截器;

浙公网安备 33010602011771号