顧名思義,責任鏈模式(chain of responsibility pattern)為請求建立了乙個接收者物件的鏈。這種模式給予請求的型別,對請求的傳送者和接收者進行解耦。這種型別的設計模式屬於行為型模式。在這種模式中,通常每個接收者都包含對另乙個接收者的引用。如果乙個物件不能處理該請求,那麼它會把相同的請求傳給下乙個接收者,依此類推。
主要解決職責鏈上的處理者負責處理請求,客戶只需要將請求傳送到職責鏈上即可,無須關心請求的處理細節和請求的傳遞,所以職責鏈將請求的傳送者和請求的處理者解耦了。大話設計模式中,程杰老師給出的定義是,責任鏈模式:避免請求傳送者與接收者耦合在一起,讓多個物件都有可能接收請求,將這些物件連線成一條鏈,並且沿著這條鏈傳遞請求,直到有物件處理它為止。
在責任鏈模式中發出請求的客戶端並不知道這當中的哪個物件最終處理這個請求,這樣系統的更改可以在不影響客戶端的情況下動態的重新組織和分配責任。
實現原理:
handler 裡面聚合它自己,在 handlerrequest 裡判斷是否合適,如果沒達到條件則向下傳遞,向誰傳遞之前 set 進去。使用場景:最重要的兩點,乙個是你需要事先給每個具體管理者設定它的上司是哪個類,也就是設定後繼者。另一點就是你需要在每個具體管理者處理請求時,做出判斷,是可以處理這個請求,還是必須要「推卸責任」,轉移給後繼者去處理。
1、有多個物件可以處理同乙個請求,具體哪個物件處理該請求由執行時刻自動確定。責任鏈模式結構圖:2、在不明確指定接收者的情況下,向多個物件中的乙個提交乙個請求。
3、可動態指定一組物件處理請求。
結構**析:
handler定義乙個處理請示的介面;**實現:concretehandler具體處理者類,處理它所負責的請求,可訪問它的後繼者,如果可以處理該請求,就處理,否則就將該請求**給它的後繼者。
package com.response;
public
abstract
class handler
public
void
setsuccessor(handler successor)
//處理請求
public
void
handlerequest(int request) {}
}
package com.response;
/** * 當請求數在0~10之間時有權處理,否則轉到下一位
*@author lmb
* */
public
class
concretehandlera
extends
handler else
if (successor != null) }}
package com.response;
/** * 當請求數在10~20之間時有權處理,否則轉到下一位
*@author lmb
* */
public
class
concretehandlerb
extends
handler else
if (successor != null) }}
package com.response;
/** * 當請求數在20~30之間時有權處理,否則轉到下一位
*@author lmb
* */
public
class
concretehandlerc
extends
handler else
if (successor != null) }}
package com.response;
public
class responsechainpatterndemo ;
for (int request : requests) }}
執行結果:
優點:
1、降低耦合度。它將請求的傳送者和接收者解耦。缺點:2、簡化了物件。使得物件不需要知道鏈的結構。
3、增強給物件指派職責的靈活性。通過改變鏈內的成員或者調動它們的次序,允許動態地新增或者刪除責任。
4、增加新的請求處理類很方便。
1、不能保證請求一定被接收。2、系統效能將受到一定影響,而且在進行**除錯時不太方便,可能會造成迴圈呼叫。
3、可能不容易觀察執行時的特徵,有礙於除錯。
大話設計模式 責任鏈模式
china of responsibility 使多個物件都有機會處理請求,從而避免請求的傳送者和接受者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有乙個物件處理它為止。像這種情況在我們身邊隨處可見,比如,班裡想申請乙個教室舉辦元旦晚會,文藝委員不能自作主張使用某個教室,於是找...
大話設計模式之責任鏈模式
使多個物件都有機會處理請求,從而避免請求的傳送者和接受者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈處理該請求,直到有乙個物件處理它為止。1 降低耦合度。它將請求的傳送者和接收者解耦。2 簡化了物件。使得物件不需要知道鏈的結構。3 增強給物件指派職責的靈活性。通過改變鏈內的成員或者調動它們的次...
設計模式 責任鏈模式
定義 避免請求傳送者與接收者耦合在一起,讓多個物件都有可能接收請求,將這些請求連線成一條鏈,並且沿著這條鏈傳遞請求,直到有物件處理它為止。例項 請假加薪審批 using system using system.collections.generic using system.text namespa...