設(shè)計模式-策略模式(常用)

介紹:

在軟件開發(fā)中也常常遇到類似的情況,實現(xiàn)某一個功能有多種算法或者策略,我們可以根據(jù)環(huán)境或者條件的不同選擇不同的算法或者策略來完成該功能。如查找、排序等。
  一種常用的方法將多種算法寫到一個類中,該類提供多個方法,每一個方法對應(yīng)一個具體的查找算法;當然也可以將這些查找算法封裝在一個統(tǒng)一的方法中,通過if…else…或者switch-case等條件判斷語句來進行選擇。這兩種實現(xiàn)方法我們都可以稱之為硬編碼。然而,當很多個算法集中在一個類中時,這個類就會變得臃腫,這個類的維護成本變高也更易發(fā)生錯誤。如果需要種一種新的排序算法,需要修改封裝算法類的源代碼。這就明顯違反了OCP原則和單一職責原則。
  如果將這些算法或者策略抽象出來 ,提供一個統(tǒng)一的接口,不同的算法或者策略有不同的實現(xiàn)類,這樣在程序客戶端就可以通過注入不同的實現(xiàn)對象來實現(xiàn)算法或者策略的動態(tài)替換,這種式的可擴展性、可維護性也就更高,這就是策略模式。

定義:

策略模式定義了一系列的算法,并將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立于使用它的客戶而獨立變化。

使用場景:

1.針對同一類型的多種處理方式,僅僅是具體行為有差別時。
2.需要安全地封裝多種同一類型的操作時。
3.出現(xiàn)同一抽象類有多個子類,而又需要使用if-else或者switch-case來選擇具體子類時。

具體實現(xiàn):

不同的交通工具計費規(guī)則不同,以公交地鐵為例


public class StrategyModel {

    CalculateStrategy calculateStrategy;

    public void main(String[] args) {
        StrategyModel strategyModel = new StrategyModel();
        strategyModel.setStrategy(new BusStrategy());
        System.out.println("花費 " + strategyModel.calculatePrice(10) + " 元");


    }

    public void setStrategy(CalculateStrategy calculateStrategy) {
        this.calculateStrategy = calculateStrategy;
    }

    public int calculatePrice(int km) {
        return this.calculateStrategy.calculatePrice(km);
    }

    public interface CalculateStrategy {
        /**
         * 按距離計算價格
         *
         * @param km
         * @return
         */
        int calculatePrice(int km);
    }

    public class BusStrategy implements CalculateStrategy {

        @Override
        public int calculatePrice(int km) {
            return km * 5;
        }
    }


    class SubwayStrategy implements CalculateStrategy {

        @Override
        public int calculatePrice(int km) {
            return km * 10;
        }
    }

}

策略模式主要用來分離算法,在相同的行為抽象下有不同的具體實現(xiàn)策略。這個模式很好地演示了開閉原則,也就是定義抽象,注入不同的實現(xiàn),從而達到很好的擴展性。

優(yōu)點:

結(jié)構(gòu)清晰明了,使用簡單直觀;
耦合充相應(yīng)而言較低,擴展方便;
操作封裝也更為徹底,數(shù)據(jù)更為安全。

缺點:

隨著策略的增加,子類也會變的繁多。


參考 :
《Android源碼設(shè)計模式解析與實戰(zhàn)》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 設(shè)計模式匯總 一、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復使用、多...
    MinoyJet閱讀 4,074評論 1 15
  • 1 場景問題# 1.1 報價管理## 向客戶報價,對于銷售部門的人來講,這是一個非常重大、非常復雜的問題,對不同的...
    七寸知架構(gòu)閱讀 5,243評論 9 62
  • 設(shè)計模式基本原則 開放-封閉原則(OCP),是說軟件實體(類、模塊、函數(shù)等等)應(yīng)該可以拓展,但是不可修改。開-閉原...
    西山薄涼閱讀 4,071評論 3 14
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,769評論 25 709
  • 1 場景問題 1.1 報價管理 向客戶報價,對于銷售部門的人來講,這是一個非常重大、非常復雜的問題,對不同的客戶要...
    4e70992f13e7閱讀 3,207評論 2 16

友情鏈接更多精彩內(nèi)容