策略模式

1、策略模式介紹

一、定義與類型

定義:定義了算法家族,分別封裝起來,讓它們之間能夠互相替換,此模式讓算法的變化不會影響到使用算法的用戶。
能夠替換掉大量的 if...else...…
類型:行爲型算法

二、適用場景

系統有不少類,而他們的區別僅僅在於他們的行爲
不一樣一個系統須要動態地在幾種算法中選擇一種spring

三、優勢

符合開閉原則
避免使用多重條件轉移語句
提升算法的保密性和安全性設計模式

四、缺點

客戶端必須知道全部的策略類,並自行決定使用哪個策略類。
產生不少策略類安全

五、相關設計模式

策略模式和工廠模式(工廠方法和抽象工廠)
工廠模式接受指令建立對應的對象,策略模式接受建立好的對象執行不一樣的行爲ide

策略模式和狀態模式測試

2、代碼示例

模擬場景:店鋪針對不一樣的活動,調用不一樣的優惠策略this

一、V1版本:

策略接口:設計

public interface PromotionStrategy {
    void doPromotion();
}

策略實現類1(返現):code

public class FanXianPromotionStrategy implements PromotionStrategy{
    @Override
    public void doPromotion() {
        System.out.println("返現促銷,返回的金額存放到用戶的餘額中");
    }
}

策略實現類2(立減):對象

public class LiJianPromotionStrategy implements PromotionStrategy {
    @Override
    public void doPromotion() {
        System.out.println("立減促銷,商品的價格直接減去配置的價格");
    }
}

策略實現類3(滿減):

public class ManJianPromotionStrategy implements PromotionStrategy{
    @Override
    public void doPromotion() {
        System.out.println("滿減促銷,滿200-20元");
    }
}

策略調用類:

public class PromotionActivity {
    private PromotionStrategy promotionStrategy;

    public PromotionActivity(PromotionStrategy promotionStrategy) {
        this.promotionStrategy = promotionStrategy;
    }

    public void executePromotionStrategy(){
        promotionStrategy.doPromotion();
    }
}

測試類:

public class Test {
    public static void main(String[] args) {
        PromotionActivity promotionActivity618 = new PromotionActivity(new LiJianPromotionStrategy());
        PromotionActivity promotionActivity1111 = new PromotionActivity(new FanXianPromotionStrategy());

        promotionActivity618.executePromotionStrategy();
        promotionActivity1111.executePromotionStrategy();
    }
}

二、V2版本(結合簡單工廠、靜態容器單例模式):

策略接口與策略實現類同樣,無需策略調用類,增長空策略類、策略工廠
空策略類:

public class EmptyPromotionStrategy implements PromotionStrategy{
    @Override
    public void doPromotion() {
        System.out.println("無促銷活動");
    }
}

策略工廠類:

public class PromotionStrategyFactory {
    private static Map<String, PromotionStrategy> PROMOTION_STRATEGY_MAP = new HashMap<String, PromotionStrategy>();
    static {
        PROMOTION_STRATEGY_MAP.put(PromotionKey.LIJIAN, new LiJianPromotionStrategy());
        PROMOTION_STRATEGY_MAP.put(PromotionKey.FANXIAN, new FanXianPromotionStrategy());
        PROMOTION_STRATEGY_MAP.put(PromotionKey.MANJIAN, new ManJianPromotionStrategy());
    }

    private PromotionStrategyFactory(){

    }

    // 無促銷類
    public static final EmptyPromotionStrategy NON_PROMOTION = new EmptyPromotionStrategy();

    public static PromotionStrategy getPromotionStrategy(String promotionKey){
        PromotionStrategy promotionStrategy = PROMOTION_STRATEGY_MAP.get(promotionKey);
        return promotionStrategy == null ? NON_PROMOTION : promotionStrategy;
    }

    private interface PromotionKey{
        String LIJIAN = "LIJIAN";
        String FANXIAN = "FANXIAN";
        String MANJIAN = "MANJIAN";
    }
}

測試類:

public class Test {
    public static void main(String[] args) {
        String promotionKey = "LIJIAN";
        PromotionStrategy promotionStrategy = PromotionStrategyFactory.getPromotionStrategy(promotionKey);
        promotionStrategy.doPromotion();
    }
}

3、源碼示例

一、JDK中的Comparator

在ArrayList的sort方法中,須要傳入一個Comparator,做爲排序的策略

二、spring中的InstantiationStrategy

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息