Android設計模式之“組件協作模式”:Strategy 策略模式

油油豬 8年前發布 | 4K 次閱讀 策略模式 Android開發 移動開發

要解決什么問題

  1. 在軟件構建過程,某些對象使用的算法可能多種多樣,經常改變,如不同國家的費率,如果將這些算法都編碼到對象中,將會使用對象變得異常復雜;而且有時候支持(都寫在一個類)不使用的算法是一個性能負擔

  2. 如何在運行時根據需要透明地更改對象算法?將算法與對象本身解耦,從而避免上述問題?

也就是說,我們需要在不同情況下執行不同的方法體,結構化設計則要使用枚舉、switch-case、if-else等語句進行判斷,每個判斷結果中都包含對應的算法,就會導致一個類中集合了許多算法,造成一個類十分復雜;而使用的可能就只有其中一個,其他算法因為都在同一個類中,會一同被加載到內存當中,造成性能負擔,不必要的算法占用了內存。

模式定義

將一系列算法封裝到各個類當中(一個算法一個類) (變化的) ,并且是他們可以互相替換 (提供統一接口) 。該模式使得算法可獨立于使用它的 客戶程序(穩定)變化(擴展、子類化)

模式結構類圖

從上面的類圖可以看出,這個模式,在我們的客戶程序中,需要執行一個方法,例如是稅率計算,但是不同國家的計算方法不一樣,則會有不同的算法(具體實現的方法體),為了讓客戶程序可以應對日后新增的國家的計算方法,我們把具體的算法封裝到不同的策略類的子類當中,通過多態(虛函數的多態調用),就可以在客戶程序不改變的情況下,添加新的子類即可。這里我們通過 策略基類 ,為客戶程序提供了統一的接口,提高了程序的擴展性。同時,當沒用到的算法,其所在的類是不會被加載到內存當中,從而將內存降低到最小。

這個模式符合了面向對象設計8大原則中的“開閉原則 ”,后期僅需要擴展增加,不需要修改。

為了讓客戶程序執行對應策略子類的方法,一般這樣操作:

StrategyBase sb;
public Client(StrategyBase sb){
        this.sb = sb;
}

public void run(){ sb.algorithmInterface(); }</code></pre>

在調用該客戶類時,傳入具體的策略子類對象作為構造方法參數,辣么客戶程序執行run方法時,就會執行我們new的子類對象的算法了。

要點

  1. Strategy及其子類為組件提供了一系列可重用的算法,從而可以使得類型在運行時方便地根據需要在各個算法之間進行切換; (每個Strategy子類有一個可重用的方法,在運行時根據上下文不同,執行不同子類中的算法)
  2. Strategy模式提供了用判斷語句以外的另一種選擇(面向對象的方案),消除了條件判斷語句(結構化),這是在解耦。含有許多條判斷語句的代碼,通常都需要通過Strategy模式進行重構;
  3. 如果Strategy對象沒有實例變量,那么各個上下文可以共享一個Strategy對象,從而節省對象開銷。

三思

枚舉類型/ switch case / if else ---- 多態 的重構 ---- strategy模式替代

 

來自:http://www.jianshu.com/p/e18b4b3b4eb5

 

 本文由用戶 油油豬 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!