一、责任链模式是什么?
责任链模式是一种行为型的软件设计模式,对象内存在对下家的引用,层层连接形成了一条责任链,请求的信息在链上传递直到某个对象决定处理该信息。
责任链模式的优点:
- 请求者和接收者松耦合。请求者只需要发送请求,不关心由谁处理怎么处理;接收者只需要处理自己该处理的,剩下的交给责任链上的其他职责处理。
- 比较灵活。责任链上各个职责对象,可以灵活排序或组合,以应对不同场景。
责任链模式的缺点:
- 性能易受影响。当责任链过长时,对请求的处理效率不够高。
- 不一定确保请求完整处理。每个职责只对自身部分负责,有可能请求走完整个责任链,也没有完全处理。
二、责任链模式
2.1 结构图
客户端即Main主函数,操作者中有自己的下家,下家也是操作者。
2.2 代码示例
场景描述:申请批假。
//Handler.h /****************************************************/ #pragma once #include <iostream> using namespace std; // 抽象操作者-职位 class Job { public: // 批准假期 virtual void approveLeave(int time) = 0; // 设置领导 void setLeader(Job* handler) { m_leader = handler; } protected: Job* m_leader = nullptr; }; // 具体操作者-主管 class Manager : public Job { public: // 批准假期 virtual void approveLeave(int time) { if (time <= 3) { cout << "主管正在处理批假申请。" << endl; } else if (m_leader != nullptr) { m_leader->approveLeave(time); } else { cout << "未有合适领导批准该时长的假期申请。" << endl; } } }; // 具体操作者-总监 class Director : public Job { public: // 批准假期 virtual void approveLeave(int time) { if (time <= 7) { cout << "总监正在处理批假申请。" << endl; } else if (m_leader != nullptr) { m_leader->approveLeave(time); } else { cout << "未有合适领导批准该时长的假期申请。" << endl; } } };
//main.cpp /****************************************************/ #include <iostream> #include <string> #include "Handler.h" using namespace std; int main() { Job* job1 = new Manager(); Job* job2 = new Director(); // 设置领导 job1->setLeader(job2); // 收到了三份批假申请,分别3、7、10天 job1->approveLeave(3); job1->approveLeave(7); job1->approveLeave(10); delete job1; delete job2; job1 = nullptr; job2 = nullptr; return 0; }
程序结果如下。
job中设置的领导其实就是它的下家,当它无法对当前请求进行处理时,交给下家也就是领导来处理。3天假期主管就可以批准了,7天需要由总监批准,10天则需要更大的领导批准,因为暂时没设置能处理7天以上批假的领导,所以对该请求需要做一个未处理成功的说明。
三、总结
我尽可能用较通俗的话语和直观的代码例程,来表述我对责任链模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解责任链模式。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!