分享

职责链模式

 云淡锋轻 2012-12-06

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

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


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

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

         客户调用方式为:

  1. //测试案例  
  2. int main()  
  3. {     
  4.     Manager *general = new GeneralManager(NULL, "A"); //设置上级,总经理没有上级  
  5.     Manager *majordomo = new Majordomo(general, "B"); //设置上级  
  6.     Manager *common = new CommonManager(majordomo, "C"); //设置上级  
  7.     common->DealWithRequest("D",300);   //员工D要求加薪  
  8.     common->DealWithRequest("E", 600);  
  9.     common->DealWithRequest("F", 1000);  
  10.     delete common; delete majordomo; delete general;  
  11.     return 0;  
  12. }  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约