职责链模式
来源:互联网 发布:java面试宝典2015版 编辑:程序博客网 时间:2024/06/07 03:52
一 使用场景
一项购买申请需要审批,但是部门主管的权利只能批准5W一下的,总监的权利能审批5W-20W的,总经理可以审批20W以上的。这就用到职责链模式,请求的处理形成了一条链,直到有一个对象处理请求。
二 定义
职责链模式 Chain of Responsibility Pattern: 避免将请求发送者与接收者耦合在一起,让对个对象都有机会接受到请求,将这些对象连接成一条链,并且沿着这条链传递请求。直到有对象处理它为止。
Handler 抽象处理者:定义一个抽象的接口,定义抽象的处理方法,不同的处理者处理请求的方式不一样。
ConcreteHandler 具体处理者:抽象处理者的子类,具体处理请求,但是处理之前需要判断,如果自己可以处理则处理,否则转发给后继者。
三 C++实现一个职责链模式
本例中为简化操作,只设置了两级,部门经理和总监。
Manager.h
#pragma once#include <iostream> #include <string> using namespace std; class Manager{protected: std::string m_name; Manager * m_manager;public: Manager(Manager * _manager, std::string _name):m_name(_name),m_manager(_manager){} virtual void DealRequest(std::string _name, int _num) = 0; virtual ~Manager(){}};
Inspector.h
#pragma once#include <iostream> #include <string> #include "Manager.h"using namespace std; class Inspector:public Manager{public: Inspector(Manager * _manager, std::string _name):Manager(_manager, _name){} void DealRequest(std::string _name, int _num){ std::cout << "Inspector agree!" << std::endl; }};
DepartManager.h
#pragma once#include <iostream> #include <string> #include "Manager.h"using namespace std; class DepartManager:public Manager{public: DepartManager(Manager * _manager, std::string _name):Manager(_manager, _name){} void DealRequest(std::string _name, int _num){ if(_num < 5){ std::cout << "depart manager agree" << std::endl; } else { std::cout << "depart manager can not agree, give inspector" << std::endl; m_manager->DealRequest(_name, _num); } } virtual ~DepartManager(){}};
main.cpp
#include <iostream>#include <string>#include "Manager.h"#include "DepartManager.h"#include "Inspector.h"int main(){ Manager * inspector = new Inspector(NULL, "A"); Manager * depart_manager = new DepartManager(inspector, "B"); depart_manager->DealRequest("doc1", 4); // 4W元的材料1需要批准 std::cout << "--------" << std::endl; depart_manager->DealRequest("doc2",10); // 10W元的材料2需要批准 system("pause"); return 0;}
运行结果
四 总结
优点:
1职责链模式使得一个对象不用知道是哪一个对象处理它的请求。对象仅需要知道该请求会被正确的处理。
2 可以增加新的请求处理者,无需修改源代码, 符合开闭准则。
缺点:
1 没有明确的接受者,可能请求到最后也不会被处理。
2 如果建立链接不当会产生死循环。
3 请求涉及较多的处理,影响性能,不便调试。
1 0
- 职责链设计模式
- 职责链模式
- 职责链模式
- 职责链模式
- ChainOfResponsibility(职责链)模式
- 职责链模式ChainOfResponsibility
- 职责链模式
- 职责链模式 ResponsibilityChainPattern
- 【设计模式】职责链
- 职责链模式
- java职责链模式
- 职责链模式
- 职责链模式
- 职责链模式(python)
- 职责链模式
- 职责链模式
- 职责链模式
- 职责链模式
- iOS 开发 Runtime到底是什么?
- 记录学习Laravel遇到的坑
- 个人学习安卓基础的小逻辑-勾选和滑动控件
- 软件光栅器六之透视纹理映射
- Android Canvas drawArc方法介绍
- 职责链模式
- 搜索专题(BFS)HDU 1253-胜利大逃亡
- 【Linux】管道的通信总结
- Java模拟post请求
- gradle bug solution
- 滚动条
- TimePicker DatePicker使用
- VS2013/MFC编程入门之二十二(常用控件:按钮控件的编程实例)
- 从上往下遍历二元树