命令模式:一次設定,統一執行。
狀態模式:
相當於If else if else;
設計路線:各個State類的內部實現(相當於If,else If內的條件)
執行時通過State調用Context方法來執行。
職責鏈模式:
相當於Swich case
設計路線:客戶設定,每個子類(case)的參數是下一個子類(case)。
使用時,向鏈的第一個子類的執行方法傳遞參數就可以。
————————————————————————————————————
命令模式:將多個命令只提交給一個執行該命令的對象
而職責鏈模式相反:只將一個請求提交給多個能執行該命令的對象
狀態模式與職責鏈模式的區別:
狀態模式是讓各個狀態對象自己知道其下一個處理的對象是誰,即在編譯時便設定好了的;
而職責鏈模式中的各個對象並不指定其下一個處理的對象到底是誰,只有在客戶端才設定。
————————————————————————————————————
職責鏈模式
鏈的組織是從最特殊的到最一般的,並且不能保證請求在任何情況下都回有相應。
職責鏈將程序中每個對象能做什么的內容隔離,即職責鏈減少了對象之間的耦合,每個對象都能獨立操作。職責鏈也可用於構成主程序的對象和包含其它對象實例的對象。
適用場景:
1 具有相同方法的幾個對象都適合於執行程序請求操作,但由對象決定由誰去完成操作,比把決策建立在調用代碼中更合適
2 其中某個對象可能最適合處理請求,但你不想通過一些列if-else語句或switch語句去選擇一個特定的對象
3 程序執行時,需要向處理選項鏈中添加新的對象
4 在多個對象都能執行一個請求的情況下,你不想把這些相互作用的內容放在調用程序里
鏈中每個對象都是“自治”的,最后一個對象決定是默認處理請求,還是拋棄
命令模式
職責鏈沿類鏈轉發請求,而命令模式只將請求轉發給一個特定對象。命令模式把一個申請特定操作的請求封裝到一個對象中,並給該對象一個眾所周知的公共接口,使客戶端不用了解實際執行的操作就能產生請求,也可以使你改變操作而絲毫不影響客戶端程序。
命令模式的效果:
命令模式的主要缺點是,增加了使程序散亂的小類,不過,即使有單獨的單擊事件,也通常都調用小的私有方法完成具體功能。最后的結果是,私有方法和我們這些小類的代碼長度幾乎一樣,因此,構建 Command類和編寫較多的方法在復雜性上通常沒有區別,主要區別是命令模式生成的小類更容易理解。
使用命令設計模式的另一個主要原因是,他們提供了一個便捷的存儲方法並能完成Undo功能。每個命令對象都記住剛剛做過的事,並在有Undo請求時,只要計算量和內存需求不太過分,就能恢復到剛才的狀態
