什麼是策略模式?
策略模式(英文:Strategy Pattern),定義了一系列演算法,並將每個演算法封裝起來,使它們可以相互替換,且演算法的改變不會影響使用演算法的客戶。
一句話歸納
條條大道通羅馬,具體哪條你決定
程式碼示例
我所在的公司是一家電商公司,電商公司在每一個節日都會搞一些促銷活動,比如“618”、“雙11”、“年貨節”等等;在這些促銷活動還會有不同的促銷手段,比如“全場滿減”、“滿折”、“拼團”等等,而對於我們程式設計師來講,每一次促銷活動都是一次對系統的大考。
類與類之間的關係如下:
具體程式碼如下所示:
public class PromotionStrategyFactory { private static Map PROMOTION_STRATEGY = new HashMap<>(); static { PROMOTION_STRATEGY。put(PromotionKey。FULL_REDUCTION, new FullReductionStrategy()); PROMOTION_STRATEGY。put(PromotionKey。FULL_DISCOUNT, new FullDiscountStrategy()); PROMOTION_STRATEGY。put(PromotionKey。GROUP_WORK, new GroupWorkStrategy()); } private static final PromotionStrategy EMPTY_PROMOTION = new EmptyStrategy(); private PromotionStrategyFactory(){} public static PromotionStrategy getPromotionStrategy(String promotionKey) { PromotionStrategy promotionStrategy = PROMOTION_STRATEGY。get(promotionKey); return Objects。isNull(promotionStrategy) ? EMPTY_PROMOTION : promotionStrategy; } private interface PromotionKey { String FULL_REDUCTION = “FULL REDUCTION”; String FULL_DISCOUNT = “FULL_DISCOUNT”; String GROUP_WORK = “GROUP_WORK”; }}interface PromotionStrategy { void doPromotion();}class FullReductionStrategy implements PromotionStrategy { @Override public void doPromotion() { System。out。println(“全場滿減”); }}class FullDiscountStrategy implements PromotionStrategy { @Override public void doPromotion() { System。out。println(“全場滿折”); }}class GroupWorkStrategy implements PromotionStrategy { @Override public void doPromotion() { System。out。println(“拼團”); }}class EmptyStrategy implements PromotionStrategy { @Override public void doPromotion() { System。out。println(“無促銷活動”); }}
適用性
以下我建議你考慮使用:
演算法可以自由切換的時候;
多個類在演算法和行為上稍稍不同的時候;
演算法相對獨立,並且要對客戶端隱藏具體的實現細節的時候;
比如支付渠道:有支付寶、微信、銀聯支付;快遞有順豐、中通、京東等等。
侷限性
以下我建議你謹慎使用:
每一個策略都是一個類,複用的可能性小,類會增多;
客戶端必須知道每一個策略之間的區別,以便在合適的場景選擇恰當的策略。
寫在最後
好兄弟可以點贊並關注我的公眾號“javaAnswer”,全部都是乾貨。