策略模式

策略模式的优点:

  • 策略模式符合开闭原则
  • 策略模式可避免使用多重条件语句
  • 使用策略模式可以提高算法的保密性和安全性

策略模式的缺点:

  • 客户端必须知道所有的策略,并且自行决定使用哪一个策略类
  • 代码中会产生很多的策略类,增加代码的维护难度

用策略模式实现业务场景

大家都知道,平时我们购买东西经常会有优惠,优惠策略有很多种,如优惠券抵扣、返现促销、拼团。

接下来就模拟这个场景,首先创建一个策略接口 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();

    }
}

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章