策略模式--條條大路通羅馬(行爲模式07)

什麼是策略模式
策略模式定義了一系列封裝好的算法,使他們可以相互替換。
策略模式讓算法獨立於使用他的客戶端獨立變化。

策略模式的適用場景
同一種問題有多重處理方式,僅僅在具體實現有差別
需要安全的封裝同一類型的操作
實現同一抽象有多個子類,而又需要適用分支操作選擇具體子類時

策略模式用例
我們從出發地到目的地可以選擇坐公交車,也可以選擇打的,公交車比較便宜實惠,打的比較貴但是快且舒適,選擇哪一種方式都能實現目的,但是根據實際情況,比如時間緊迫怕堵車可以選擇摩的,不怕擠可以選擇公交,想要舒適的環境可以多花點錢打的等。

UML用例圖
這裏寫圖片描述

IPrice接口:

public interface IPrice {
    int calculatePrice(int distance);
}

BusStrategy:

public class BusStrategy implements IPrice {

    @Override
    public int calculatePrice(int distance) {
        // 公交車票價,起步價1元,3公里外每公里加一元
        int total = distance - 3;
        int mPrice = total + 1;
        return distance>0?mPrice:1;
    }

}

CarStrategy:

public class CarStrategy implements IPrice {

    @Override
    public int calculatePrice(int distance) {
        // 出租車票價,起步價5元,3公里外每公里加3元
        int total = distance - 3;
        int mPrice = total*3 + 5;
        return distance>0?mPrice:5;
    }

}

測試類:

public class Test {
    BusStrategy bs;
    CarStrategy cs;
    public static void main(String[] args) {
        //公交車
        Test test = new Test();
        test.setBusStrategy(new BusStrategy());
        System.out.println("公交車價格:"+test.calculateBusPrice(10)+" 元");

        //出租車
        Test test2 = new Test();
        test2.setCarStrategy(new CarStrategy());
        System.out.println("出租車價格:"+test2.calculateCarPrice(10)+" 元");
    }

    public void setBusStrategy(BusStrategy bs){
        this.bs = bs;
    }

    public int calculateBusPrice(int distance){
        return bs.calculatePrice(distance);
    }

    public void setCarStrategy(CarStrategy cs){
        this.cs = cs;
    }

    public int calculateCarPrice(int distance){
        return cs.calculatePrice(distance);
    }

}

測試結果:

公交車價格:8 元
出租車價格:26 元

策略模式總結:
策略模式主要用來分離算法步驟,比如這個我們把公交和出租車分開來計算,解耦操作。
優點:結構清晰,使用簡單。耦合度低,擴展方便。操作封裝徹底,數據安全。
缺點:隨着策略增多,子類更多,比如我們要加入火車、飛機、輪船等等交通工具。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章