職責鏈模式

2021-10-03 13:02:14 字數 2950 閱讀 2385

職責鏈模式(chain of responsibility pattern):避免請求傳送者與接收者耦合在一起,讓多個物件都有可能接收請求,將這些物件連線成一條鏈,並且沿著這條鏈傳遞請求,直到有物件處理它為止。

handler(抽象處理者):它定義了乙個處理請求的介面,一般設計為抽象類,由於不同的具體處理者處理請求的方式不同,因此在其中定義了抽象請求處理方法。因為每乙個處理者的下家還是乙個處理者,因此在抽象處理者中定義了乙個抽象處理者型別的物件(如結構圖中的successor),作為其對下家的引用。通過該引用,處理者可以連成一條鏈。

concretehandler(具體處理者):它是抽象處理者的子類,可以處理使用者請求,在具體處理者類中實現了抽象處理者中定義的抽象請求處理方法,在處理請求之前需要進行判斷,看是否有相應的處理許可權,如果可以處理請求就處理它,否則將請求**給後繼者;在具體處理者中可以訪問鏈中下乙個物件,以便請求的**。

使用職責鏈模式實現採購單的分級審批,根據採購金額的不同由不同層次的主管人員來審批,主任可以審批5萬元以下(不包括5萬元)的採購單,副董事長可以審批5萬元至10萬元(不包括10萬元)的採購單,董事長可以審批10萬元至50萬元(不包括50萬元)的採購單,50萬元及以上的採購單就需要開董事會討論決定。

**結構如下:

**如下:

/**

* 採購單:請求類

*/public class purchaserequest

public double getamount(

) public void setamount(double amount)

public int getnumber(

) public void setnumber(int number)

public string getpurpose(

) public void setpurpose(string purpose)

}

/**

* 審批者類:抽象處理者

*/ protected string name; //審批者姓名

//設定後繼者

//抽象請求處理方法

public abstract void processrequest(purchaserequest request)

;}

/**

* 主任類:具體處理者

*/ public director(string name)

@override

public void processrequest(purchaserequest request)

else

}}

/**

* 副董事長類:具體處理者

*/ public vicepresident(string name)

//具體請求處理方法

@override

public void processrequest(purchaserequest request)

else

}}

/**

* 董事長類:具體處理者

*/ public president(string name)

//具體請求處理方法

@override

public void processrequest(purchaserequest request)

else

}}

public congress(string name)

//具體請求處理方法

@override

public void processrequest(purchaserequest request)

}

/**

* 客戶端呼叫類

*/public class client

}

主要優點:

1)職責鏈模式使得乙個物件無須知道是其他哪乙個物件處理其請求,物件僅需知道該請求會被處理即可,接收者和傳送者都沒有對方的明確資訊,且鏈中的物件不需要知道鏈的結構,由客戶端負責鏈的建立,降低了系統的耦合度。

2)請求處理物件僅需維持乙個指向其後繼者的引用,而不需要維持它對所有的候選處理者的引用,可簡化物件的相互連線。

3)在給物件分派職責時,職責鏈可以給我們更多的靈活性,可以通過在執行時對該鏈進行動態的增加或修改來增加或改變處理乙個請求的職責。

4)在系統中增加乙個新的具體請求處理者時無須修改原有系統的**,只需要在客戶端重新建鏈即可,從這一點來看是符合「開閉原則」的。

主題缺點:

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

2)對於比較長的職責鏈,請求的處理可能涉及到多個處理物件,系統效能將受到一定影響,而且在進行**除錯時不太方便。

3)如果建鏈不當,可能會造成迴圈呼叫,將導致系統陷入死迴圈。

適用場景:

1)有多個物件可以處理同乙個請求,具體哪個物件處理該請求待執行時刻再確定,客戶端只需將請求提交到鏈上,而無須關心請求的處理物件是誰以及它是如何處理的。

2)在不明確指定接收者的情況下,向多個物件中的乙個提交乙個請求。

3)可動態指定一組物件處理請求,客戶端可以動態建立職責鏈來處理請求,還可以改變鏈中處理者之間的先後次序。

職責鏈模式

1.職責鏈 namespace dutychainpattern 用來處理請求 public abstract void transmitrequest int request 班主任 職責鏈上的乙個節點,在裡面進行判斷,看能否處理請求,不能則將請求轉移 public class classadvi...

職責鏈模式

軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用c 寫了個小例子,加深一下理解。主要參考 大話設計模式 和 設...

職責鏈模式

劇情簡要 學習此模式,讓筆者聯想到自然界的生物鏈。打個比方 大魚吃小魚,小魚吃蝦公尺。河裡的小蝦公尺問大魚,你要不要吃我啊?大魚說 你太小了,吃了 沒吃,return 懶得吃!然後蝦公尺又問小魚 小螃蟹 小河馬同樣的問題。其實如果小蝦公尺這麼想自我了結的話,根本不用這麼費勁。這就開始了我們職責鏈模式...