前言
最近心情很差,因為生活,因為工作;所以想請幾天假去麗江玩玩。就向專案經理提交了休假申請,我的專案經理向專案主管提交了我的休假申請,專案主管向部門經理提交了我的休假申請;最後,部門經理同意了我的休假申請。是的,乙個簡單的休假申請,需要這麼複雜的流程,這也是乙個公司保證它正常執行的必要。如果部門經理休假了,那麼我的休假申請由誰審批呢?這個時候由專案主管代替部門經理進行審批。乙個休假申請的審批制度有著嚴格的要求。而在處理這個請假審批時,各個人員就好比在一條鏈上的節點,我不知道我的請求由誰審批,但是,我的請求最終會有人來處理的。而這樣的一種行為,就好比我今天需要總結的職責鏈模式一樣。
什麼是職責鏈模式?
在gof的《設計模式:可復用物件導向軟體的基礎》一書中對職責鏈模式是這樣說的:使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,直到有乙個物件處理它為止;如下圖:
對於每個角色,他們都有他們的職責;當我提交了休假申請時,專案經理需要判斷,看看自己能否處理,如果休假超過了2個小時,那麼專案經理就不能處理了;專案經理將這個請求提交到專案主管,專案主管判斷部門經理在不在,如果部門經理在,專案主管就不能處理了;最後,我的休假申請就到了部門經理那裡了,由他親自審批。可以很明顯的看到,專案經理、專案主管和部門經理都有可能處理我的休假申請,我的請求沿著這條鏈一直走下去,直到有人處理了我的請求。
uml類圖
handler:定義了乙個處理請求的介面;其它類如果需要處理相同的請求,可以實現該介面就好了;
concretehandler:處理它所負責的請求,如果可處理該請求,就處理掉這個請求;否則將該請求**給它的下乙個可以處理該請求的物件,所以它必須能訪問它的下乙個可以處理同樣請求的物件;
client:向處理物件提出具體的請求。
當客戶提交乙個請求時,請求沿著一條鏈傳遞,直至有乙個concretehandler物件負責處理它。
使用場合
1.有多個的物件可以處理乙個請求,由哪個物件處理該請求是在執行時刻自動確定的;
2.如果想在不明確指定接收者的情況下,向多個物件中的乙個提交乙個請求;
3.可以處理乙個請求的物件集合應被動態指定。
**實現
複製**
**如下:
#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); }
優缺點
1.降低耦合度;職責鏈模式使得乙個物件不用知道是哪乙個物件處理它的請求。物件僅需要知道該請求會被正確的處理。接收者和傳送者都沒有對方的明確的資訊,且鏈中的物件不需要知道鏈的結構;
2.增強了給物件指派職責的靈活性;當在物件中分派職責時,職責鏈給你更多的靈活性。你可以通過在執行時對該鏈進行動態的增加或修改來增加或改變處理乙個請求的那些職責;
3.不保證被接受,既然乙個請求沒有明確的接收者,那麼就不能保證它一定會被處理;該請求可能一直到鏈的末端都得不到處理。乙個請求也可能因該鏈沒有被正確配置而得不到處理。
總結
職責鏈模式在實現時,需要處理好它的後繼者的問題,就是說,如果我不處理這個請求,那麼我將把這個請求發給誰去處理呢?同時,職責鏈模式在實現時,它的鏈的形狀並不是由職責鏈本身建立和維護的,而是由客戶進行建立的,由客戶指定每乙個處理者的後繼者是誰。這就大大的提高了職責鏈的靈活性。在實際中,我們也可以將職責鏈模式與組合模式相結合,乙個構件的父構件可以作為它的後繼者。
C 設計模式之 職責鏈模式
使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有乙個物件處理它為止。處理請求 this.gettype name,request else if successor null class concretehandler2 h...
C 設計模式之職責鏈
iron之職責鏈 需求 iron 的建造一直沒有停止,現在單個部件是有的,但是在部件從工廠裡出來的時候,在組裝到一起之前,我們還是非常有必要對部件進行質量檢測,或者是其它個方面的檢測,又或者是設定部件標識資訊等等,這些操作可以是有序的 也可以是無序的 現在為了實現上面的所講的功能來進行演示,然過程中...
設計模式之職責鏈模式
如果我們現在有乙個需求,乙個人他生了病,這個病要在 醫院才能看,但是這個病人並不清楚,就先去了一級醫院,一級醫院的醫生告訴他你的病要去二級醫院看,二級醫院也告訴他 你的病我這裡看不了,你要去 醫院才能看,最後他去 醫院把病看好了.這個過程直接寫成 class patient this.patient...