《設計模式之禪》——行爲類模式大PK

1.命令模式VS策略模式

       策略模式的意圖是封裝算法,它認爲算法已經是一個完整的、不可拆分的原子業務(注意這裏是原子業務,而不是原子對象),即其意圖是讓這些算法獨立,並且可以相互替換,讓行爲的變化獨立於擁有行爲的客戶;而命令模式則是對動作的解耦,把一個動作的執行分爲執行對象(接收者角色)、執行行爲(命令角色),讓兩者相互獨立而不相互影響。

1.1最佳實踐

       命令模式和策略模式的類圖完全一樣,代碼實現也比較類似,但是兩者還是有區別的。

  • 關注點不同
           策略模式關注的是算法的完整性、封裝性,只有具備了這兩個條件才能保證其可以自由切換。命令模式則關注的是解耦問題。
  • 角色功能不同
           策略模式中的抽象算法和具體算法與命令模式的接收者非常相似,但是他們的職責不同。策略模式中的具體算法是負責一個完整算法邏輯,它是不可再拆分的原子業務單元,一旦變更就是對算法整體的變更。而命令模式關注的是功能的實現。
  • 使用場景不同
           策略模式使用於算法要求變換的場景,而命令模式適用於解耦兩個有緊耦合關係的對象場合或者多命令多撤銷的場景。

2.狀態模式VS策略模式

       策略模式封裝的是不同的算法,算法之間沒有交互、以達到算法可以自由切換的目的;而狀態模式封裝的是不同的狀態,以達到狀態切換行爲隨之發生改變的目的。這兩個模式雖然都有變換的行爲,但是兩者的目標卻是不同的。

2.1最佳實踐

  • 環境角色的職責不同
           兩者都有一個叫做Context環境角色的類, 策略模式的環境角色只是一個委託作用,負責算法的替換;而狀態模式的環境角色不僅僅是委託行爲,它還具有登記狀態變化的功能,與具體的狀態類協作,共同完成狀態切換的任務。
  • 解決問題的重點不同
           策略模式旨在解決內部算法如何改變的問題,也就是將內部算法的改變對外界的影響降低到最小程度,它保證算法可以自由切換;而狀態模式旨在解決內在狀態的改變而引起行爲改變的問題,它的出發點是事物的狀態,封裝狀態而暴露行爲,一個對象的狀態改變,從外界看就好像是行爲改變。
  • 解決問題的方法不同
           策略模式只是確保算法可以自由切換,但是什麼時候用什麼算法它決定不了;而狀態模式對外暴露的是行爲,狀態的變化一般由環境角色和具體狀態共同完成的,也就是說狀態模式封裝了狀態的變化而暴露了不同的行爲或行爲結果。
  • 應用場景不同
           策略模式是一系列平行的、可相互替換的算法封裝後的結構。狀態模式則要求有一系列狀態發生變化的場景,它要求的是有狀態且有行爲的場景,也就是一個對象必須具有二維描述才能採用狀態模式,如果只有狀態而沒有行爲,則狀態的變化就失去了意義。
  • 複雜度不同
           通常策略模式結構簡單,擴展比較容易,而且代碼也容易閱讀。而狀態模式通常比較複雜,因爲它要從兩個角色看到一個對象狀態和行爲的改變,也就是說它封裝的是變化,要知道變化是無窮盡的,因此相對來說狀態模式通常都比較複雜,涉及面很多,雖然也很容易擴展,但是一般不會進行大規模的擴展和修正。

3.觀察者模式VS責任鏈模式

       因爲觀察者模式也提到了觸發鏈的問題,所以把這兩個模式放到一起對比。

3.1最佳實踐

  • 鏈中消息對象不同
           從首節點開始到最終的尾節點,兩個鏈中傳遞的消息對象是不同的。責任鏈模式基本上不改變消息對象的結構,但是在觸發鏈傳遞的對象可以自由變化,只要上下級節點對傳遞對象瞭解即可。
  • 上下節點的關係不同
           在責任鏈中,上下節點沒有關係,都是接收同樣的對象。而觸發鏈模式的上下級關係很親密,鏈中的任意兩個相鄰節點都是一個牢固的獨立團體。
  • 消息的分銷渠道不同
           在責任鏈模式中,一個消息從鏈首傳遞進來後,就開始沿着鏈條向鏈尾運動,方向是單一的,固定的;而觸發鏈模式則不同,由於它採用的是觀察者模式,所以有非常大的靈活性,一個消息傳遞到鏈首後,具體怎麼傳遞是不固定的,可以以廣播方式傳遞,也可以以跳躍方式傳遞,這取決於處理消息的邏輯。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章