策略模式的优点:
- 策略模式符合开闭原则
- 策略模式可避免使用多重条件语句
- 使用策略模式可以提高算法的保密性和安全性
策略模式的缺点:
- 客户端必须知道所有的策略,并且自行决定使用哪一个策略类
- 代码中会产生很多的策略类,增加代码的维护难度
用策略模式实现业务场景
大家都知道,平时我们购买东西经常会有优惠,优惠策略有很多种,如优惠券抵扣、返现促销、拼团。
接下来就模拟这个场景,首先创建一个策略接口 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();
}
}