我所理解的設計模式(C++實現)——責任鏈模式(Chain Of Responsibility Pattern)

來源:互聯網
上載者:User
概述:

     辛辛苦苦了工作了一年,終於可以加薪了,向主管提交了加薪申請,主管一看不得了,自己職權不夠,批不了,主管把申請上交總監,總監發現自己也批不了,申請到了總經理手中,總經理一看,小夥子口氣不小了,有膽識敢申請,先來談下心。預知後事如何,請看下回分解。

     這就是典型的職責鏈模式,請求的處理形成了一條鏈,直到有一個對象處理請求。責任鏈模式是一種對象的行為模式。在責任鏈模式裡,很多個物件由每一個對象對其下家的引用而串連起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的用戶端並不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響用戶端的情況下動態地重新組織鏈和分配責任。

類圖與執行個體:

抽象處理者(Handler)角色:定義出一個處理請求的介面。如果需要,介面可以定義出一個方法,以設定和返回對下家的引用。這個角色通常由一個抽象類別或介面實現。

具體處理者(ConcreteHandler)角色:具體處理者接到請求後,可以選擇將請求處理掉,或者將請求傳給下家。由於具體處理者持有對下家的引用,因此,如果需要,具體處理者可以訪問下家。

範例:

#include <iostream>#include <string>using namespace std;// 請求class Request{public:int m_nNumber;};// 管理者class Manager{public:Manager(string temp) { name = temp; }void SetSuccessor(Manager* temp) { manager = temp; }virtual void GetRequest(Request* request) = 0;protected:Manager* manager;string name;};// 經理class CommonManager : public Manager{public:CommonManager(string strTemp) : Manager(strTemp) {}virtual void GetRequest(Request* request);};void CommonManager::GetRequest(Request* request){if (request->m_nNumber>=0 && request->m_nNumber<1000){cout << name << " 處理了請求: " << request->m_nNumber << endl;}else{manager->GetRequest(request);}}// 總監class Majordomo : public Manager{public:Majordomo(string strTemp) : Manager(strTemp) {}virtual void GetRequest(Request* request);};void Majordomo::GetRequest(Request* request){if (request->m_nNumber <= 5000){cout << name << " 處理了請求: " << request->m_nNumber << endl;}else{manager->GetRequest(request);}}//總經理  class GeneralManager: public Manager  {  public:  GeneralManager(string name):Manager(name) {}  virtual void GetRequest(Request* request)  //總經理可以處理所有請求  { cout << name << " 處理了請求: " << request->m_nNumber << endl;}  };int main(){Manager* common = new CommonManager("張經理");Manager* major = new Majordomo("李總監");GeneralManager* general  = new GeneralManager("趙總");common->SetSuccessor(major);major->SetSuccessor(general);Request* rq = new Request();rq->m_nNumber = 999;common->GetRequest(rq);rq->m_nNumber = 4999;common->GetRequest(rq);rq->m_nNumber = 6999;common->GetRequest(rq);delete rq;delete major;delete common;delete general;return 0;}

要點與實現:

1.要注意的是:一個請求到鏈的最後可能也沒有處理,所以一定要配置得當.

2.責任鏈模式並不建立責任鏈。責任鏈的建立必須由系統的其它部分建立出來。

3.責任鏈模式降低了請求的發送端和接收端之間的耦合,使多個對象都有機會處理這個請求。一個鏈可以是一條線,一個樹,也可以是一個環。如所示,責任鏈是一個樹結構的一部分。

LCL_data原創於CSDN.NET【http://blog.csdn.net/lcl_data/article/details/9042739】


看到這裡的各位加薪申請都是general批...    :-))

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.