1. 程式人生 > 其它 >Java~設計模式之策略模式 || 初級會員、高階會員

Java~設計模式之策略模式 || 初級會員、高階會員

技術標籤:Java設計模式演算法設計模式java

文章目錄

策略模式

  • 簡介:策略模式屬於行為型模式,一個類的行為或其演算法可以在執行時更改。
  • 意圖:定義一系列的演算法,把它們一個個封裝起來, 並且使它們可相互替換。
  • 主要解決:在有多種演算法相似的情況下,使用 if…else 所帶來的複雜和難以維護。
  • 關鍵程式碼:實現同一個介面。
  • 優點
    1、演算法可以自由切換。
    2、使用策略模式可以避免使用多重條件(if-else)語句。多重條件語句不易維護,它把採取哪一種演算法或採取哪一種行為的邏輯與演算法或行為的邏輯混合在一起,統統列在一個多重條件語句裡面,比使用繼承的辦法還要原始和落後。
    3、擴充套件性良好。
  • 缺點:
    1、由於策略模式把每個具體的策略實現都單獨封裝成為類,如果備選的策略很多的話,那麼物件的數目就會很可觀。
    2、客戶端必須知道所有的策略類,並自行決定使用哪一個策略類。這就意味著客戶端必須理解這些演算法的區別,以便適時選擇恰當的演算法類。換言之,策略模式只適用於客戶端知道演算法或行為的情況。
  • 使用場景:比如我們在網站商城購物, 同一件商品面對不同的會員會有不同的價格, 比如普通會員是原件, 中級會員是打九折, 高階會員打八折, 這就是一個策略模式
  • 注意事項:如果一個系統的策略多於四個,就需要考慮使用混合模式,解決策略類膨脹的問題。

實現

  • 我就實現上述那個會員例子, 商品面對不同的會員, 返回不同的價格
  • 把這件事分為三個角色
  1. 環境(Context)角色:持有一個Strategy的引用。
  2. 抽象策略(Strategy)角色:這是一個抽象角色,通常由一個介面或抽象類實現。此角色給出所有的具體策略類所需的介面。
  3. 具體策略(ConcreteStrategy)角色:包裝了相關的演算法或行為。
  • 三個角色的關係: 環境角色包含一個抽象策略角色, 可以接受不同的實現了抽象策略角色的具體策略角色

抽象策略角色

//抽象策略角色
public interface Strategy {

    /**
     * 策略方法
     * @param shopPrice 商品原價
     * @return 打折後的價格
     */
double strategyInterface(double shopPrice); }

初級會員策略

//初級會員策略
public class PrimaryMemberStrategy implements Strategy {

    /**
     * 初級會員返回原件
     * @param shopPrice 商品原價
     * @return
     */
    @Override
    public double strategyInterface(double shopPrice) {
        return shopPrice;
    }
}

中級會員策略

//中級會員策略
public class IntermediateMemberStrategy implements Strategy {

    /**
     * 中級會員打九折
     * @param shopPrice 商品原價
     * @return
     */
    @Override
    public double strategyInterface(double shopPrice) {
        return shopPrice * 0.9;
    }
}

高階會員策略

public class AdvancedMemberStrategy implements Strategy {

    /**
     * 高階會員打八折
     * @param shopPrice 商品原價
     * @return
     */
    @Override
    public double strategyInterface(double shopPrice) {
        return shopPrice * 0.8;
    }
}

環境角色

//環境角色
public class Context {

    /**
     * 策略實現角色
     */
    private final Strategy strategy;

    /**
     * 通過構造方法傳入一個具體策略
     * @param strategy 策略實現角色
     */
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    /**
     * 獲得打折後的價格
     * @param shopPrice 商品原件
     * @return 打折後的價格
     */
    public double getNewPrice(double shopPrice) {
        return this.strategy.strategyInterface(shopPrice);
    }
}

客戶端

public class Client {

    public static void main(String[] args) {
        //建立需要的策略實現角色
        AdvancedMemberStrategy advancedMemberStrategy = new AdvancedMemberStrategy();
        //建立打折環境角色
        Context context = new Context(advancedMemberStrategy);
        //獲得打折後的價格
        System.out.println(context.getNewPrice(99.99));
    }
}

在這裡插入圖片描述

  • 總結策略模式就是我們可以通過一個統一的抽象策略介面,策略實現者只需要實現這個介面就可以實現粗略的擴充套件, 策略使用者也就是環境角色內含一個抽象策略介面, 只需要把傳進來的資料進行實現即可, 無需關注其如何實現, 這個和橋接模式有那麼點相通之處, 但是對那進行了多策略實現的一個擴充套件