設計模式:策略模式

什麼是策略模式?

策略模式(英文: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”,全部都是乾貨。