責任鏈模式

2021-10-22 04:51:00 字數 2845 閱讀 5856

責任鏈模式:chain of responsibility

顧名思義,責任鏈模式(chain of responsibility pattern)為請求建立了乙個接收者物件的鏈。這種模式給予請求的型別,對請求的傳送者和接收者進行解耦。這種型別的設計模式屬於行為型模式。

在這種模式中,通常每個接收者都包含對另乙個接收者的引用。如果乙個物件不能處理該請求,那麼它會把相同的請求傳給下乙個接收者,依此類推。

可以模擬想象一下上級審批檔案,需要一級一級的往上走。

優點:

1、降低耦合度。它將請求的傳送者和接收者解耦。

2、簡化了物件。使得物件不需要知道鏈的結構。

3、增強給物件指派職責的靈活性。通過改變鏈內的成員或者調動它們的次序,允許動態地新增或者刪除責任。

4、增加新的請求處理類很方便。

缺點:

1、不能保證請求一定被接收。

2、系統效能將受到一定影響,而且在進行**除錯時不太方便,可能會造成迴圈呼叫。

3、可能不容易觀察執行時的特徵,有礙於除錯。

應用場景:

1、專案中的審批流程,根據被審批物件的內容細節執行對應的審批流程

2、原始碼中常見的過濾器

區分經典責任鏈模式和變種責任鏈模式

責任鏈由多個節點(處理器)組成。在行為模式上有兩種:一種是遍歷鏈條上的節點,直到找到對應節點,然後處理,這種叫經典責任鏈模式。另一種是由各個節點依次處理,共享負擔責任的一部分,我們稱它為變種責任鏈模式。兩種模式在結構上也會不一樣,前者基於陣列進行遍歷,後者通過以用組成鍊錶。

這兩種方式很好區分,我們就看這個功能是不是像case…when一樣,只會執行其中一種方式,如果是那就是經典責任鏈模式,反之則是變種責任鏈模式。

簡單編寫乙個使用責任鏈模式的demo:完成對我們輸入的字串的資訊轉換,我們使用的是變種責任鏈模式。

編寫乙個頂層的介面,定義我們需要執行的方法

inte***ce

filter

編寫具體的執行該處理的操作節點

//url處理

class

urlfilter

implements

filter

}//轉義字元處理

class

speccharfilter

implements

filter

}//數字處理

class

numberfilter

implements

filter

}

編寫乙個責任鏈類,串連我們所有的操作節點

//訊息處理鏈

class

filterchain

implements

filter

//遍歷執行該鏈條中的所有操作方法

@override

public

boolean

dofilter

(textinfo text)

return

true;}

}

編寫對應的訊息類,模擬我們真實場景中接受到的訊息

//具體的訊息類

class

textinfo

public

void

setstr

(string str)

@override

public string tostring()

}

測試類

public

class

test01

}

執行結果

**類的基本骨架

我們的框架中就是用了很多的這種設計模式,這裡以mybatis為例

在我們使用sqlsessionfactory建立sqlsession物件的過程中,在建立對應的執行器之後就會對我們的外掛程式進行乙個處理

模擬我們前面的小demo,該類和我們的filterchain作用是一樣的,我們測試**中也有類似的迴圈,也有對應的add方法。

當然我們也應該明白,pluginall方法的作用是,迴圈乙個包含interceptor物件的list集合,並且呼叫該物件的plug方法

責任鏈模式

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

責任鏈模式

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

責任鏈模式

了解了一下責任鏈模式,簡單的說下自己的理解吧 責任鏈就是說待處理的資料在request的時候,先經過filter1的處理,再經過filter2的處理,然後response時,先經過filter2的處理,在經過filter1的處理。實現思路是filterchain包括filter1和filter2,同...