責任鏈模式為某個請求建立乙個物件鏈,每個物件依次檢查此請求,並對其進行處理,或者將它傳給鏈中的下乙個物件。
鍊錶是很常見一種資料結構,責任鏈模式的結構其實和鍊錶相差無幾,唯一的區別就是責任鏈模式中所有的物件都有乙個共同的父類(或介面):
在責任鏈模式中,n個 handler 子類都處理同乙個請求,只不過具體的職責有所差別。
當有乙個請求進入時,先經過 ahandler 的 handlerrequest 方法,然後再把請求傳遞給 bhandler,b 處理完再把請求傳遞給 chandler,以此類推,形成乙個鏈條。鏈條上的每乙個物件所承擔的責任各不相同,這就是責任鏈模式。
現在我們模擬乙個場景:論壇使用者發表帖子,但是常常會有使用者一些不良的資訊,如廣告資訊,涉黃資訊,涉及政治的敏感詞等。這時我們就可以使用責任鏈模式來過濾使用者發表的資訊。
先定義所有責任鏈物件的父類:
/**
* 帖子處理器
*/public
abstract
class
posthandler
public
abstract
void
handlerrequest
(post post)
;protected
final
void
next
(post post)
}}
父類 handler 主要封裝了傳遞請求等方法,其中要注意的有兩點:
廣告處理器:
/**
* 廣告處理器
*/public
class
adhandler
extends
posthandler
}
涉黃處理器:
/**
* 涉黃處理器
*/public
class
yellowhandler
extends
posthandler
}
呼叫:
//建立責任物件
posthandler adhandler =
newadhandler()
;posthandler yellowhandler =
newyellowhandler()
;posthandler swhandler =
newsensitivewordshandler()
;//形成責任鏈
yellowhandler.
setsuccessor
(swhandler)
;adhandler.
setsuccessor
(yellowhandler)
;post post =
newpost()
;post.
setcontent
("我是正常內容,我是廣告,我是涉黃,我是敏感詞,我是正常內容");
system.out.
println
("過濾前的內容為:"
+post.
getcontent()
);post = adhandler.
handlerrequest
(post)
;system.out.
println
("過濾後的內容為:"
+post.
getcontent()
);
可能大家有疑問,為什麼不把所有的過濾器寫在乙個方法裡呢?因為這樣做又破壞了開放封閉原則。我們需要使用責任鏈模式,能夠在不修改已有**的情況下擴充套件新功能。
責任鏈模式將常用於過濾器,***,事件(滑鼠鍵盤事件,冒泡事件等)等場景
軟體體系結構 軟體體系結構概論
開學到現在我已經上了三節軟體體系結構的課程,現在我想把自己學到的整理歸納一下。此篇隨筆對應於教材軟體體系結構概論一章。首先談一談我剛接觸這門課程是的感受。那就是 我靠 軟體也會有體系結構?以前只學過資料結構 演算法 基本的程式語言,覺得程式設計無非就是使用者給我需求,我便按照需求來程式設計序就好,從...
軟體體系結構 組合模式
在軟體設計與程式設計中經常會遇到屬性資料,當處理屬性結構的資料時,程式設計師必須經常區分葉子結點和樹的乙個樹枝結點。這使得 變得更加複雜,容易出錯。允許一致地對待複雜和原始物件的介面,客戶類以相同的方式對待單獨的物件和一組物件。使用不同的語言作為問候語,使用者選擇乙個國家,程式顯示該國家見面時使用的...
軟體體系結構
軟體體系結構是具有一定形式的結構化元素,即構件的集合,包括處理構件 資料構建 連線構建。處理構建 負責對資料進行加工 資料構建 是被加工的資訊 連線構建 把體系結構的不同部分組合連線起來 1 作為通訊的手段 2 代表了早期的設計決策結果 3 高層次的設計復用手段 1 軟體體系結構是風險承擔者 又稱涉...