責任鏈模式(職責鏈模式)

2022-09-18 14:54:18 字數 2193 閱讀 4209

責任鏈(chain of responsibility)模式的定義:為了避免請求傳送者與多個請求處理者耦合在一起,於是將所有請求的處理者通過前一物件記住其下乙個物件的引用而連成一條鏈;當有請求發生時,可將請求沿著這條鏈傳遞,直到有物件處理它為止。

注意:責任鏈模式也叫職責鏈模式。

在責任鏈模式中,客戶只需要將請求傳送到責任鏈上即可,無須關心請求的處理細節和請求的傳遞過程,請求會自動進行傳遞。所以責任鏈將請求的傳送者和請求的處理者解耦了。

責任鏈模式是一種物件行為型模式,其主要優點如下。

降低了物件之間的耦合度。該模式使得乙個物件無須知道到底是哪乙個物件處理其請求以及鏈的結構,傳送者和接收者也無須擁有對方的明確資訊。

增強了系統的可擴充套件性。可以根據需要增加新的請求處理類,滿足開閉原則。

增強了給物件指派職責的靈活性。當工作流程發生變化,可以動態地改變鏈內的成員或者調動它們的次序,也可動態地新增或者刪除責任。

責任鏈簡化了物件之間的連線。每個物件只需保持乙個指向其後繼者的引用,不需保持其他所有處理者的引用,這避免了使用眾多的 if 或者 if···else 語句。

責任分擔。每個類只需要處理自己該處理的工作,不該處理的傳遞給下乙個物件完成,明確各類的責任範圍,符合類的單一職責原則。

其主要缺點如下。

不能保證每個請求一定被處理。由於乙個請求沒有明確的接收者,所以不能保證它一定會被處理,該請求可能一直傳到鏈的末端都得不到處理。

對比較長的職責鏈,請求的處理可能涉及多個處理物件,系統效能將受到一定影響。

職責鏈建立的合理性要靠客戶端來保證,增加了客戶端的複雜性,可能會由於職責鏈的錯誤設定而導致系統出錯,如可能會造成迴圈呼叫。

通常情況下,可以通過資料鏈表來實現職責鏈模式的資料結構。

1. 模式的結構

職責鏈模式主要包含以下角色。

抽象處理者(handler)角色:定義乙個處理請求的介面,包含抽象處理方法和乙個後繼連線。

具體處理者(concrete handler)角色:實現抽象處理者的處理方法,判斷能否處理本次請求,如果可以處理請求則處理,否則將該請求轉給它的後繼者。

客戶類(client)角色:建立處理鏈,並向鏈頭的具體處理者物件提交請求,它不關心處理細節和請求的傳遞過程。

責任鏈模式的本質是解耦請求與處理,讓請求在處理鏈中能進行傳遞與被處理;理解責任鏈模式應當理解其模式,而不是其具體實現。責任鏈模式的獨到之處是將其節點處理者組合成了鏈式結構,並允許節點自身決定是否進行請求處理或**,相當於讓請求流動起來。

其結構圖如圖 1 所示。客戶端可按圖 2 所示設定責任鏈。

2. 模式的實現

職責鏈模式的實現**如下:

package chainofresponsibility;

public class chainofresponsibilitypattern

}//抽象處理者角色

abstract class handler

public handler getnext()

//處理請求的方法

public abstract void handlerequest(string request);

}//具體處理者角色1

class concretehandler1 extends handler else else }}

}//具體處理者角色2

class concretehandler2 extends handler else else }}

}

在上面**中,我們把訊息硬編碼為 string 型別,而在真實業務中,訊息是具備多樣性的,可以是 int、string 或者自定義型別。因此,在上面**的基礎上,可以對訊息型別進行抽象 request,增強了訊息的相容性。

前邊已經講述了關於責任鏈模式的結構與特點,下面介紹其應用場景,責任鏈模式通常在以下幾種情況使用。

多個物件可以處理乙個請求,但具體由哪個物件處理該請求在執行時自動確定。

可動態指定一組物件處理請求,或新增新的處理者。

需要在不明確指定請求處理者的情況下,向多個處理者中的乙個提交請求。

職責鏈模式存在以下兩種情況。

純的職責鏈模式:乙個請求必須被某乙個處理者物件所接收,且乙個具體處理者對某個請求的處理只能採用以下兩種行為之一:自己處理(承擔責任);把責任推給下家處理。

不純的職責鏈模式:允許出現某乙個具體處理者物件在承擔了請求的一部分責任後又將剩餘的責任傳給下家的情況,且乙個請求可以最終不被任何接收端物件所接收。

責任鏈模式(職責鏈模式)

當我學習了責任鏈模式,準備進行寫作分享的時候,我覺得拿魔塔這個遊戲進行舉例說明可能比較貼近,魔塔裡面每10層有乙個boss,而這個boss的屬性可能從一開始的問號到明確數值。當你被打敗後,會被嘲諷兩句,然後你會去刷裝備 刷等級 刷屬性 氪金變強等等,然後打敗了第乙個boss,會繼續重複這個流程,只是...

責任鏈模式

責任鏈模式 chain of responsibility 的目標是使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞請求,直到有乙個物件處理它為止。舉個例子。你到銀行去辦理業務,只是簡單的存個錢,也許atm就解決你的問題。如果你是為了交費...

責任鏈模式

有3個request與3個handler,每個request由相應的handler來處理,當乙個handler與request不匹配時則傳遞給下乙個handler來處理 inte ce request class request1 implements request class request2 ...