使用策略模式实现电商多种促销优惠方案选择
马上要双11了,很多电商平台都会推出优惠活动。优惠策略有很多种,如领取优惠券抵扣、返现促销、拼团优惠、秒杀优惠等。下面我们使用策略模式来模拟实现电商中多种促销优惠方案的选择。
首先创建一个抽象策略角色 PromotionStrategy。
CouponStrategy 类的代码如下。
所以通常代码会这样写。
回顾之前学过的设计模式,我们可以结合单例模式和简单工厂模式来优化这段代码。创建 PromotionStrategyFactory 类。
首先创建一个抽象策略角色 PromotionStrategy。
/** * 促销策略抽象 */ public interface PromotionStrategy { void doPromotion(); }然后分别创建优惠券抵扣策略 CouponStrategy 类、返现促销策略 CashbackStrategy 类、拼团优惠策略 GroupBuyStrategy 类和无优惠策略 EmptyStrategy 类。
CouponStrategy 类的代码如下。
public class CouponStrategy implements PromotionStrategy { public void doPromotion() { System.out.println("使用优惠券抵扣"); } }CashbackStrategy 类的代码如下。
public class CashbackStrategy implements PromotionStrategy { public void doPromotion() { System.out.println("返现,直接打款到支付宝账号"); } }GroupBuyStrategy 类的代码如下。
public class GroupBuyStrategy implements PromotionStrategy { public void doPromotion() { System.out.println("5人成团,可以优惠"); } }EmptyStrategy 类的代码如下。
public class EmptyStrategy implements PromotionStrategy { public void doPromotion() { System.out.println("无优惠"); } }创建促销活动方案 PromotionActivity 类。
public class PromotionActivity { private PromotionStrategy strategy; public PromotionActivity(PromotionStrategy strategy) { this.strategy = strategy; } public void execute() { strategy.doPromotion(); } }最后编写客户端测试代码。
public class Test { public static void main(String[] args) { PromotionActivity activity618 = new PromotionActivity(new CouponStrategy()); PromotionActivity activity1111 = new PromotionActivity(new CouponStrategy()); activity618.execute(); activity1111.execute(); } }此时,可以发现上面这段客户端测试代码并不适用于实际的业务场景,因为我们做活动时往往要根据不同的需求对促销策略进行动态选择,并不会一次性执行多种优惠。
所以通常代码会这样写。
public class Test { public static void main(String[] args) { PromotionActivity activity = null; String promotionKey = "COUPON"; if (StringUtils.equals(promotionKey, "COUPON")) { activity = new PromotionActivity(new CouponStrategy()); } else if (StringUtils.equals(promotionKey, "CASHBACK")) { activity = new PromotionActivity(new CashbackStrategy()); } activity.execute(); } }这样改造之后,代码就满足了业务需求,客户可根据自己的需求选择不同的优惠策略。但是,经过一段时间的业务积累,促销活动会越来越多,程序员就开始经常加班,每次上活动之前就要通宵改代码,而且要做重复测试,判断逻辑可能也会变得越来越复杂。此时,我们就要思考代码是否需要重构。
回顾之前学过的设计模式,我们可以结合单例模式和简单工厂模式来优化这段代码。创建 PromotionStrategyFactory 类。
public class PromotionStrategyFactory { private static Map<String, PromotionStrategy> PROMOTIONS = new HashMap<String, PromotionStrategy>(); static { PROMOTIONS.put(PromotionKey.COUPON, new CouponStrategy()); PROMOTIONS.put(PromotionKey.CASHBACK, new CashbackStrategy()); PROMOTIONS.put(PromotionKey.GROUPBUY, new GroupBuyStrategy()); } private static final PromotionStrategy EMPTY = new EmptyStrategy(); private PromotionStrategyFactory() { } public static PromotionStrategy getPromotionStrategy(String promotionKey) { PromotionStrategy strategy = PROMOTIONS.get(promotionKey); return strategy == null ? EMPTY : strategy; } private interface PromotionKey { String COUPON = "COUPON"; String CASHBACK = "CASHBACK"; String GROUPBUY = "GROUPBUY"; } public static Set<String> getPromotionKeys() { return PROMOTIONS.keySet(); } }这时客户端测试代码如下。
public class Test { public static void main(String[] args) { PromotionStrategyFactory.getPromotionKeys(); String promotionKey = "COUPON"; PromotionStrategy promotionStrategy = PromotionStrategyFactory.getPromotionStrategy(promotionKey); promotionStrategy.doPromotion(); } }这样代码优化之后,每次上新活动都不会影响原来的代码逻辑,程序员的维护工作也变得轻松了。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算