C 設計模式 職責鏈模式

2021-10-02 03:31:46 字數 2140 閱讀 7769

什麼是職責鏈模式?

在gof的《設計模式:可復用物件導向軟體的基礎》一書中對職責鏈模式是這樣說的:使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,直到有乙個物件處理它為止;如下圖:

對於每個角色,他們都有他們的職責;當我提交了休假申請時,專案經理需要判斷,看看自己能否處理,如果休假超過了2個小時,那麼專案經理就不能處理了;專案經理將這個請求提交到專案主管,專案主管判斷部門經理在不在,如果部門經理在,專案主管就不能處理了;最後,我的休假申請就到了部門經理那裡了,由他親自審批。可以很明顯的看到,專案經理、專案主管和部門經理都有可能處理我的休假申請,我的請求沿著這條鏈一直走下去,直到有人處理了我的請求。

uml類圖

handler:定義了乙個處理請求的介面;其它類如果需要處理相同的請求,可以實現該介面就好了;

concretehandler:處理它所負責的請求,如果可處理該請求,就處理掉這個請求;否則將該請求**給它的下乙個可以處理該請求的物件,所以它必須能訪問它的下乙個可以處理同樣請求的物件;

client:向處理物件提出具體的請求。

當客戶提交乙個請求時,請求沿著一條鏈傳遞,直至有乙個concretehandler物件負責處理它。

使用場合

有多個的物件可以處理乙個請求,由哪個物件處理該請求是在執行時刻自動確定的;

如果想在不明確指定接收者的情況下,向多個物件中的乙個提交乙個請求;

可以處理乙個請求的物件集合應被動態指定。

**實現

#include using namespace std;

#define safe_delete(p) if (p)

class holidayrequest

int gethour()

private:

int m_ihour;};

// the holiday request handler inte***ce

class manager;

// project manager

class pm : public manager

bool handlerequest(holidayrequest *prequest)

private:

manager *m_phandler;};

// department manager

class dm : public manager

bool handlerequest(holidayrequest *prequest)

}cout<

safe_delete(pholidayrequest);

pholidayrequest = new holidayrequest(2);

ppm->handlerequest(pholidayrequest);

safe_delete(pdm);

safe_delete(pps);

safe_delete(ppm);

safe_delete(pholidayrequest);

}

優缺點

降低耦合度;職責鏈模式使得乙個物件不用知道是哪乙個物件處理它的請求。物件僅需要知道該請求會被正確的處理。接收者和傳送者都沒有對方的明確的資訊,且鏈中的物件不需要知道鏈的結構;

增強了給物件指派職責的靈活性;當在物件中分派職責時,職責鏈給你更多的靈活性。你可以通過在執行時對該鏈進行動態的增加或修改來增加或改變處理乙個請求的那些職責;

不保證被接受,既然乙個請求沒有明確的接收者,那麼就不能保證它一定會被處理;該請求可能一直到鏈的末端都得不到處理。乙個請求也可能因該鏈沒有被正確配置而得不到處理。 總結

職責鏈模式在實現時,需要處理好它的後繼者的問題,就是說,如果我不處理這個請求,那麼我將把這個請求發給誰去處理呢?同時,職責鏈模式在實現時,它的鏈的形狀並不是由職責鏈本身建立和維護的,而是由客戶進行建立的,由客戶指定每乙個處理者的後繼者是誰。這就大大的提高了職責鏈的靈活性。在實際中,我們也可以將職責鏈模式與組合模式相結合,乙個構件的父構件可以作為它的後繼者。

設計模式 職責鏈模式 C

職責鏈模式 解耦請求的傳送者和請求的接受者,使多個物件都由機會接收到這個請求。所有的物件形成一條鏈,在這條鏈中總有乙個物件可以出來這個請求。場景 有多個物件可以處理乙個請求,那個物件處理這個請求則執行時確定 在不明確接受者的情況下,向多個物件中傳送乙個請求 include 任務型別 enum typ...

C 設計模式 職責鏈模式

目錄 基本概念 與例項 在哪種地方使用 職責鏈模式 chain of responsibility 時多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這個物件連線成一條鏈,並沿著這條鏈條傳遞該請求,直到有乙個物件處理它為止。這裡發出這個請求的客戶端並不知道這當中的哪個物件最終...

c 設計模式 職責鏈模式

本文參考 假如有多個物件可以處理同乙個請求,但是具體由哪個物件處理是在執行時刻動態決定的。這時就可以使用職責鏈模式,將處理請求的物件實現成職責物件,並構造鏈。職責鏈模式主要包含兩種角色 第一種,抽象職責類。第二種,具體職責類。以員工請求加薪為例。如果員工請求加薪小於500,那麼經理可以直接處理,如果...