責任鏈模式: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,同...