定義:定義了算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化不會影響到使用算法的用戶,且可以替換掉程序中大量的“if-else”語句;
類型:行爲型;
適用場景
- 系統有很多類,而它們的區別僅僅在於行爲不同
- 一個系統需要動態地在算法中選擇出一種
優點
- 符合開閉原則
- 可以避免大量的條件轉移語句(if-else,switch)
- 提供算法的保密性和安全性
缺點
- 客戶端必須要知道所有的策略類,並且自行選擇使用哪一個策略類
- 產生很多策略類
以商品促銷舉例
// 促銷策略接口
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