设计模式——响应链模式

首先纠正国人的错误翻译,Responsibility 虽然字典里翻译为职责,然而确是由Response派生出来的词,结合此模式的原意,故此处应该翻译为响应更合适,或者说,垃圾字典里至少也应添加"响应"作为另一中文词.



软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。

响应链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。其思想很简单,考虑员工要求加薪。公司的管理者一共有三级,总经理、总监、经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的数量在经理的职权内,那么经理可以直接批准,否则将申请上交给总监。总监的处理方式也一样,总经理可以处理所有请求。这就是典型的响应链模式,请求的处理形成了一条链,直到有一个对象处理请求。给出这个例子的UML图。

设计模式——响应链模式

代码的实现比较简单,如下所示:





1. //抽象管理者
2. classManager
3. {
4. protected:
5. Manager m_manager;
6. string m_name;
7. public:
8. Manager(Manager
manager, string name):m_manager(manager), m_name(name){}
9. virtualvoidDealWithRequest(string name,intnum) {}
10. };
11. //经理
12. classCommonManager:publicManager
13. {
14. public:
15. CommonManager(Manager manager, string name):Manager(manager,name) {}
16. voidDealWithRequest(string name,intnum)
17. {
18. if(num < 500)//经理职权之内
19. {
20. cout<<"经理"<<m_name<<"批准"<<name<<"加薪"<<num<<"元"<<endl<<endl;
21. }
22. else
23. {
24. cout<<"经理"<<m_name<<"无法处理,交由总监处理"<\
25. \m_manager->DealWithRequest(name, num);
26. }
27. }
28. };
29. //总监
30. classMajordomo:publicManager
31. {
32. public:
33. Majordomo(Manager
manager, string name):Manager(manager,name) {}
34. voidDealWithRequest(string name,intnum)
35. {
36. if(num < 1000)//总监职权之内
37. {
38. cout<<"总监"<<m_name<<"批准"<<name<<"加薪"<<num<<"元"<<endl<<endl;
39. }
40. else
41. {
42. cout<<"总监"<<m_name<<"无法处理,交由总经理处理"<\
43. \m_manager->DealWithRequest(name, num);
44. }
45. }
46. };
47. //总经理
48. classGeneralManager:publicManager
49. {
50. public:
51. GeneralManager(Manager *manager, string name):Manager(manager,name) {}
52. voidDealWithRequest(string name,intnum)//总经理可以处理所有请求
53. {
54. cout<<"总经理"<<m_name<<"批准"<<name<<"加薪"<<num<<"元"<<endl<<endl;
55. }
56. };

客户调用方式为:




1. //测试案例
2. intmain()
3. {
4. Manager general =newGeneralManager(NULL,"A");//设置上级,总经理没有上级
5. Manager
majordomo =newMajordomo(general,"B");//设置上级
6. Manager *common =newCommonManager(majordomo,"C");//设置上级
7. common->DealWithRequest("D",300);//员工D要求加薪
8. common->DealWithRequest("E", 600);
9. common->DealWithRequest("F", 1000);
10. deletecommon;deletemajordomo;deletegeneral;
11. return0;
12. }
原文链接: https://www.cnblogs.com/hibernate6/archive/2012/02/23/2521931.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/42360

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 下午7:08
下一篇 2023年2月8日 下午7:08

相关推荐