定義:定義了算法家族,分別封裝起來,讓它們之間能夠互相替換,此模式讓算法的變化不會影響到使用算法的用戶。
能夠替換掉大量的 if...else...…
類型:行爲型算法
系統有不少類,而他們的區別僅僅在於他們的行爲
不一樣一個系統須要動態地在幾種算法中選擇一種spring
符合開閉原則
避免使用多重條件轉移語句
提升算法的保密性和安全性設計模式
客戶端必須知道全部的策略類,並自行決定使用哪個策略類。
產生不少策略類安全
策略模式和工廠模式(工廠方法和抽象工廠)
工廠模式接受指令建立對應的對象,策略模式接受建立好的對象執行不一樣的行爲ide
策略模式和狀態模式測試
模擬場景:店鋪針對不一樣的活動,調用不一樣的優惠策略this
策略接口:設計
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(); } }
策略接口與策略實現類同樣,無需策略調用類,增長空策略類、策略工廠
空策略類:
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(); } }
在ArrayList的sort方法中,須要傳入一個Comparator,做爲排序的策略