程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++設計模式實現--職責鏈(Chain of Responsibility)模式

C++設計模式實現--職責鏈(Chain of Responsibility)模式

編輯:C++入門知識

一. 概述

職責鏈模式:

使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系。將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。

二. 舉個例子

員工要求加薪

公司的管理者一共有三級:總經理、總監、經理,如果一個員工要求加薪,應該向主管的經理申請,如果加薪的數量在經理的職權內,那麼經理可以直接批准,否則將申請上交給總監。總監的處理方式也一樣,總經理可以處理所有請求。這就是典型的職責鏈模式,請求的處理形成了一條鏈,直到有一個對象處理請求。

結構圖如下:

\

假設:

經理可以處理薪水的范圍在: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. 要注意的是:一個請求到鏈的最後可能也沒有處理,所以一定要配置得當。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved