策略模式

定義:定義了算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化不會影響到使用算法的用戶,且可以替換掉程序中大量的“if-else”語句;
類型:行爲型;

適用場景
  1. 系統有很多類,而它們的區別僅僅在於行爲不同
  2. 一個系統需要動態地在算法中選擇出一種
優點
  1. 符合開閉原則
  2. 可以避免大量的條件轉移語句(if-else,switch)
  3. 提供算法的保密性和安全性
缺點
  1. 客戶端必須要知道所有的策略類,並且自行選擇使用哪一個策略類
  2. 產生很多策略類
以商品促銷舉例
// 促銷策略接口
public interface PromotionStrategy {
    void doPromotion();
}

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

// 立減促銷策略
public class LiJianPromotionStrategy implements PromotionStrategy {
    public void doPromotion() {
        System.out.println("立減促銷,立減20元");
    }
}

// 返現促銷策略
public class FanXianPromotionStrategy implements PromotionStrategy {
    public void doPromotion() {
        System.out.println("返現促銷,返現20元");
    }
}

// 無促銷策略
public class NonePromotionStrategy implements PromotionStrategy {
    public void doPromotion() {
        System.out.println("無促銷");
    }
}

//促銷活動
public class PromotionActivity {
    private PromotionStrategy promotionStrategy;

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

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

// 促銷策略工廠
public class PromotionStrategyFactory {
    private static final Map<String,PromotionStrategy> PROMOTION_STRATEGY_MAP = new HashMap<String, PromotionStrategy>();
    private static final PromotionStrategy NONE_PROMOTION = new NonePromotionStrategy();
    static {
        PROMOTION_STRATEGY_MAP.put(PromotionKey.FANXIAN, new FanXianPromotionStrategy());
        PROMOTION_STRATEGY_MAP.put(PromotionKey.MANJIAN, new ManJianPromotionStrategy());
        PROMOTION_STRATEGY_MAP.put(PromotionKey.LIJIAN, new LiJianPromotionStrategy());
    }

    private PromotionStrategyFactory() {
    }

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

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

}

// 測試類
public class Test {
    public static void main(String[] args) {
        String promotionKey1 = "LIJIAN";
        PromotionActivity promotionActivity1 =
                new PromotionActivity(PromotionStrategyFactory.getPromotionStrategy(promotionKey1));
        promotionActivity1.executePromotionStrategy();

        String promotionKey2 = "MANJIAN";
        PromotionActivity promotionActivity2 =
                new PromotionActivity(PromotionStrategyFactory.getPromotionStrategy(promotionKey2));
        promotionActivity2.executePromotionStrategy();

    }
}

// 輸出結果
立減促銷,立減20元
滿減促銷,滿200-20
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章