设为首页 加入收藏

TOP

C++设计模式实现--职责链(Chain of Responsibility)模式
2015-07-24 05:54:44 来源: 作者: 【 】 浏览:6
Tags:设计模式 实现 职责 Chain Responsibility 模式

一. 概述

职责链模式:

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

二. 举个例子

员工要求加薪

公司的管理者一共有三级:总经理、总监、经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的数量在经理的职权内,那么经理可以直接批准,否则将申请上交给总监。总监的处理方式也一样,总经理可以处理所有请求。这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求。

结构图如下:

\

假设:

经理可以处理薪水的范围在:0~500
总监可以处理薪水的范围在:500~1000
总经理可以处理薪水的范围在:1000~2000

则代码如下:

[cpp] view plaincopy
  1. //////////////////////////////////////////////////////////////////////////
  2. //抽象处理类
  3. class Handle
  4. {
  5. public:
  6. virtual ~Handle()
  7. {
  8. delete _succ;
  9. }
  10. virtual void HandleRequest(int request) = 0;
  11. //设置其上级
  12. void SetSuccessor(Handle* succ)
  13. {
  14. _succ = succ;
  15. }
  16. Handle* GetSuccessor()
  17. {
  18. return _succ;
  19. }
  20. protected:
  21. Handle()
  22. {
  23. _succ = NULL;
  24. }
  25. private:
  26. Handle* _succ;
  27. };
  28. //具体处理类 A
  29. class ConcreteHandleA: public Handle
  30. {
  31. public:
  32. void HandleRequest(int request)
  33. {
  34. if (request >= 0 && request < 500)
  35. {
  36. cout << "ConcreteHandleA deal with: " << request < }
  37. else if (this->GetSuccessor() != NULL)
  38. {
  39. this->GetSuccessor()->HandleRequest(request);
  40. }
  41. else
  42. {
  43. cout << "Can't deal with " << request << endl;
  44. }
  45. }
  46. };
  47. //具体处理类 B
  48. class ConcreteHandleB: public Handle
  49. {
  50. public:
  51. void HandleRequest(int request)
  52. {
  53. if (request >= 500 && request < 1000)
  54. {
  55. cout << "ConcreteHandleB deal with: " << request < }
  56. else if (this->GetSuccessor() != NULL)
  57. {
  58. this->GetSuccessor()->HandleRequest(request);
  59. }
  60. else
  61. {
  62. cout << "Can't deal with " << request << endl;
  63. }
  64. }
  65. };
  66. //具体处理类 C
  67. class ConcreteHandleC: public Handle
  68. {
  69. public:
  70. void HandleRequest(int request)
  71. {
  72. if (request >= 1000 && request < 2000)
  73. {
  74. cout << "ConcreteHandleC deal with: " << request < }
  75. else if (this->GetSuccessor() != NULL)
  76. {
  77. this->GetSuccessor()->HandleRequest(request);
  78. }
  79. else
  80. {
  81. cout << "Can't deal with " << request << endl;
  82. }
  83. }
  84. };
  85. //////////////////////////////////////////////////////////////////////////
  86. //测试
  87. int main()
  88. {
  89. Handle* h1 = new ConcreteHandleA();
  90. Handle* h2 = new ConcreteHandleB();
  91. Handle* h3 = new ConcreteHandleC();
  92. //设置其上级
  93. h1->SetSuccessor(h2);
  94. h2->SetSuccessor(h3);
  95. h1->HandleRequest(300);
  96. h1->HandleRequest(600);
  97. h1->HandleRequest(1500);
  98. h1->HandleRequest(3000);
  99. delete h1;
  100. delete h2;
  101. delete h3;
  102. return 0;
  103. }

    三. 说明

    1. 职责链的特点是:当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。

    2. 职责链的好处是:请求者不用管哪个对象来处理,反正该请求会被处理。它只需保持一个后继者即可。

    3. 要注意的是:一个请求到链的最后可能也没有处理,所以一定要配置得当。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++函数指针简单使用 下一篇C++中未定义类的引用。

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: