我一直在使用設計模式很長一段時間,一直在呼籲/將其稱爲「Chain-of-Responsibility pattern」,但現在我意識到存在差異,並且可能不適合這樣做。所以我的問題是1,「下面是這種模式的一個實例,還是應該被稱爲別的東西?」和2,「有什麼理由我應該更喜歡傳統的方式嗎?」。這仍然被認爲是職責鏈模式?
我在開發軟件時經常使用以下模式。我有一個界面,定義了一個functor,就像這樣。
interface FooBar{
boolean isFooBar(Object o);
}
這些通常是搜索,過濾或處理類;通常像Comparator。實現方法通常是功能性的(即無副作用)。最後,我發現自己創建看起來接口的實現,如:
class FooBarChain implements FooBar{
FooBar[] foobars;
FooBarChain(FooBar... fubars){
foobars = fubars;
}
boolean isFooBar(Object o){
for(FooBar f : foobars)
if( f.isFooBar(o) )
return true;
return false;
}
}
它並不總是布爾要麼-I've使用這種模式與可變對象爲良好,但總有一個短路條件(例如返回true,String爲空字符串,一個標誌被設置等)。
到目前爲止,我一直把這稱爲「責任鏈」模式,考慮從基類繼承的問題作爲實現細節。但是,今天我意識到了一個重要的區別:沿着鏈條的物體不能打斷鏈條的其餘部分。實施方式沒有辦法說「這是錯誤的,我可以保證它對任何情況都是錯誤的」(nb:僅在true
上短路)。
那麼,這應該被稱爲除責任鏈模式之外的東西嗎?在使用這種方法的情況下,如果使用傳統方式傳遞消息,那麼我是否應該考慮一些問題或問題。
我認爲關鍵是你的「通常做某件事而不是回報價值」的評論。我使用的一個變體是一系列文本過濾器。一個過濾器刪除罵人詞,另一個停止詞,另一個數字等。返回的結果被傳遞到下一個。如果一個過濾器返回一個空字符串(例如一個字符串只包含由一個curse過濾器處理的curse words),那麼它就會短路。我的觀點是模式不是布爾特定的,我可以想象使用它與圖像過濾器。 – ArtB
@ArtB:你的數據過濾器的例子聽起來像一個管道或裝飾模式。 – rwong