C++与设计模式(14)——职责链模式
来源:互联网 发布:网剧数据分析 编辑:程序博客网 时间:2024/06/06 14:21
职责链模式
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系
让我来描述的话就是,现在我们有很多的对象可以处理一个事件,但这个事件的拥有者并不需要认识所有处理它事件的对象,这个时候就需要责任链模式来解决。
比如需要向公司请假,一天的假期只需要向组长申请就可以了,而一周甚至更长的假期则需要上级领导的批准。把这个例子写成代码:
class Manager{public: Manager(Manager *superior):m_superior(superior){} virtual bool deelWithLeave(int day) = 0;protected: Manager *m_superior;};class GroupLeader : public Manager{public: GroupLeader(Manager *superior):Manager(superior){} virtual bool deelWithLeave(int day) { if(day <= 1) { cout << "组长批准请假" << day << "天"; return 1; } else//权限不够,向上级汇报 return m_superior->deelWithLeave(day); }};class Director : public Manager{public: Director(Manager *superior):Manager(superior){} virtual bool deelWithLeave(int day) { if(day <= 7) { cout << "主任批准请假" << day << "天"; return 1; } else return m_superior->deelWithLeave(day); }};class GeneralManager : public Manager{public: GeneralManager(Manager *superior):Manager(superior){} virtual bool deelWithLeave(int day) { cout << "总经理批准请假" << day << "天"; return 1; }};
使用
GeneralManager generalManager(nullptr);Director director(&generalManager);GroupLeader myLeader(&director);myLeader.deelWithLeave(20);
优缺点
优点
- 在责任链模式下,事件处理者们的结构对于事件发送者是未知的,无论处理者们的结构是单链或者树状的、最后一定会被执行或没有人来处理,具体的过程对于事件发送者就是一个黑盒子,事件发送者只需要简单的向自己上级汇报就可以了。
- 责任链模式实际上是非常灵活的,我们可以提供接口,使每个人的上级都是动态的,比如主任有事出去,那么主任就可以把总经理的联系方式交给组长,请假的审批仍然可以继续进行,而请假的人却不需要知道这一点。
缺点
- 当我要请一个30天的假时,你会发现在这个过程中组长和主任只是承担了一个传递信息的责任,如果我们的责任链过长,那么中间会有许多垃圾对象存在。
- 易被滥用,在一些情况下,我们可以直接创建一个对象来处理请求:
class LeaveHandler{public: bool deelWithLeave(int day) { if(day <= 1) cout << "向组长请假"; else if(day <= 7) cout << "向主任请假"; else cout << "向总经理请假"; }};
在公司的管理体制不会出现变化的情况下,这样做反而更好。
实际应用
事实上在qt的事件系统中就使用了责任链模式,当一个点击事件产生时,它会在子控件和父控件之间传递来寻求处理方案。这里可能处理完后事件就被拦截,也可能处理完好继续交给下一位去处理,我们可以通过重载对应的事件函数或event函数来改写处理过程。
0 0
- C++与设计模式(14)——职责链模式
- 《设计模式》——职责链模式
- 设计模式——职责链模式
- 设计模式——职责链模式
- 设计模式——职责链模式
- 设计模式——职责链模式
- C#设计模式之14——职责链模式
- 设计模式练习(12)——职责链模式
- 设计模式(二十)——职责链模式
- 我与C++设计模式(二十)——职责链模式
- JDK与设计模式:职责链模式
- 浅谈设计模式(职责链与命令模式)
- 浅谈设计模式(职责链与命令模式)
- 设计模式——职责链
- 设计模式——职责链
- 设计模式C++实现(14)——职责链模式
- 设计模式C++实现(14)——职责链模式
- 设计模式C++实现(14)——职责链模式
- 51nod——1091 线段的重叠(排序,贪心)
- 配置原生hadoop2.7版
- 编程习惯
- 决策树
- 017 Letter Combinations of a Phone Number
- C++与设计模式(14)——职责链模式
- RESTful Web Service最佳实践
- windows安装scala
- 三、调试运行Matlab版OpenTLD
- 单词检测源程序(升级版)
- 12.3
- 用户登录系统及一次性验证码的简单实现
- [leetcode]33. Search in Rotated Sorted Array
- 反转链表