策略模式的優點:
- 策略模式符合開閉原則
- 策略模式可避免使用多重條件語句
- 使用策略模式可以提高算法的保密性和安全性
策略模式的缺點:
- 客戶端必須知道所有的策略,並且自行決定使用哪一個策略類
- 代碼中會產生很多的策略類,增加代碼的維護難度
用策略模式實現業務場景
大家都知道,平時我們購買東西經常會有優惠,優惠策略有很多種,如優惠券抵扣、返現促銷、拼團。
接下來就模擬這個場景,首先創建一個策略接口 PromotionStrategy
/**
* @Author Lxq
* @Date 2020/3/24 15:51
* @Version 1.0
* 促銷策略接口類
*/
public interface PromotionStrategy {
void doPromotion();
}
然後就分別創建優惠券抵扣策略類 CouponStratepy、返現促銷策略類 CashbackStrategy、拼團策略類 GroupbuyStratepy、和無優惠策略類 EmptyStratepy
/**
* @Author Lxq
* @Date 2020/3/24 15:55
* @Version 1.0
* 優惠券
*/
public class CouponStratepy implements PromotionStrategy{
@Override
public void doPromotion() {
System.out.println("領取優惠券,課程的價格直接減優惠券面值抵扣!");
}
}
/**
* @Author Lxq
* @Date 2020/3/24 16:29
* @Version 1.0
* 返現促銷
*/
public class CashbackStrategy implements PromotionStrategy {
@Override
public void doPromotion() {
System.out.println("返現促銷,返回現金到支付寶!");
}
}
/**
* @Author Lxq
* @Date 2020/3/24 16:09
* @Version 1.0
* 拼團
*/
public class GroupbuyStratepy implements PromotionStrategy{
@Override
public void doPromotion() {
System.out.println("拼團,滿20人成團,全團享受優惠!");
}
}
/**
* @Author Lxq
* @Date 2020/3/24 16:36
* @Version 1.0
* 無促銷活動
*/
public class EmptyStratepy implements PromotionStrategy {
@Override
public void doPromotion() {
System.out.println("沒有促銷活動!");
}
}
創建促銷活動方案類:PromotionActivity
/**
* @Author Lxq
* @Date 2020/3/24 16:11
* @Version 1.0
* 促銷活動方案類
*
*/
public class PromotionActivity {
private PromotionStrategy promotionStrategy;
public PromotionActivity(PromotionStrategy promotionStrategy) {
this.promotionStrategy = promotionStrategy;
}
public void excute(){
promotionStrategy.doPromotion();
}
}
創建一個促銷工廠類 PromotionStrategyFactory
/**
* @Author Lxq
* @Date 2020/3/24 16:26
* @Version 1.0
* 促銷工廠類
*/
public class PromotionStrategyFactory {
private static Map<String, PromotionStrategy> PROMTION_STRATEGY_MAP = new HashMap<>();
static {
PROMTION_STRATEGY_MAP.put(PromotionKey.COUPON, new CouponStratepy());
PROMTION_STRATEGY_MAP.put(PromotionKey.CASHBACK, new CashbackStrategy());
PROMTION_STRATEGY_MAP.put(PromotionKey.GROUPBUY, new GroupbuyStratepy());
}
private static final PromotionStrategy NON_PROMOTION = new EmptyStratepy();
public PromotionStrategyFactory() {
}
public static PromotionStrategy getPromotionStrategy(String promotionkey){
PromotionStrategy promotionStrategy = PROMTION_STRATEGY_MAP.get(promotionkey);
return promotionStrategy == null ? NON_PROMOTION : promotionStrategy;
}
}
還有我們策略key的接口類:PromotionKey
/**
* @Author Lxq
* @Date 2020/3/24 16:31
* @Version 1.0
*/
public interface PromotionKey {
// 優惠券
String COUPON = "COUPON";
// 返現金
String CASHBACK = "CASHBACK";
// 拼團優惠
String GROUPBUY = "GROUPBUY";
}
最後採用一種策略測試一下:
/**
* @Author Lxq
* @Date 2020/3/24 16:17
* @Version 1.0
*/
public class Test {
public static void main(String[] args) {
String promotionKey = "GROUPBUY";
PromotionActivity promotionActivity = new PromotionActivity(PromotionStrategyFactory.getPromotionStrategy(promotionKey));
promotionActivity.excute();
}
}