网站安全狗服务名,怎么做触屏版网站,重庆网站开发公司,网站建设功能报策略模式介绍
假设你正在开发一个电商平台#xff0c;其中涉及到商品的折扣策略。优惠策略有很多种可能#xff0c;如领取优惠券抵扣、返现促销、拼团优惠等。最初的实现可能会在购物车类中嵌入各种折扣逻辑#xff0c;导致代码的可维护性和扩展性下降。
下面代码在业务开…策略模式介绍
假设你正在开发一个电商平台其中涉及到商品的折扣策略。优惠策略有很多种可能如领取优惠券抵扣、返现促销、拼团优惠等。最初的实现可能会在购物车类中嵌入各种折扣逻辑导致代码的可维护性和扩展性下降。
下面代码在业务开发中经常遇到代码满足了业务需求客户可根据自己的需求选择不同的优惠策略。但是经过一段时间的业务积累促销活动会越来越多。于是程序员就开始经常加班每次上活动之前都要通宵改代码而且要做重复测试判断逻辑可能也会变得越来越复杂。此时我们要思考代码是否需要重构。
public static void main(String[] args) {PromotionActivity promotionActivity null;String promotionKey COUPON;if(StringUtils.equals(promotionKey,COUPON)){promotionActivity new PromotionActivity(new CouponStrategy());}else if(StringUtils.equals(promotionKey,CASHBACK)){promotionActivity new PromotionActivity(new CashbackStrategy());}//......promotionActivity.execute();
}下面我们看下策略模式如何优雅的解决这个问题。
策略模式是一种行为型设计模式它允许在运行时选择算法的一种方式使得算法可以独立于客户端代码进行变化。在业务代码中使用策略模式可以帮助你实现可维护、可扩展和可变化的代码结构。下面是在业务代码中使用策略模式的一般步骤
1. 定义策略接口 首先定义一个策略接口其中声明了策略的方法或行为。这些方法将在不同的具体策略类中实现。2. 创建具体策略类 创建实现策略接口的具体策略类每个类实现了策略接口中的方法。每个具体策略类代表了一个算法或行为的具体实现。3. 在客户端代码中使用策略 在客户端代码中通过持有策略接口类型的引用可以在运行时选择不同的策略实现。这样客户端代码可以根据需要切换或替换不同的策略。 业务代码中如何使用
现在后端项目基本都是基于 Spring Boot 开发的我们基于 Spring Boot 作为基础框架教你如何使用 Spring 依赖注入的特性优雅的实现策略模式。
既然是策略模式那么定义策略肯定是首当其冲策略我们使用枚举实现最佳
public enum StrategyType {STRATEGY_A(1, 策略A),STRATEGY_B(2, 策略B);private int code;private String desc;StrategyType(int code, String desc) {this.code code;this.desc desc;}public int getCode() {return code;}public String getDesc() {return desc;}
}
再定义一个接口接口有两个方法getType用来获取策略的业务类型execute用来执行业务
public interface Strategy {void execute();StrategyType getType();}
这里我们实现个策略StrategyA
Component(strategyA)
public class StrategyA implements Strategy {Overridepublic void execute() {System.out.println(Executing strategy A);}Overridepublic StrategyType getType() {return StrategyType.STRATEGY_A;}
}
再实现个策略StrategyB
Component(strategyB)
public class StrategyB implements Strategy {Overridepublic void execute() {System.out.println(Executing strategy B);}Overridepublic StrategyType getType() {return StrategyType.STRATEGY_B;}}
我们通过定义一个工厂类然后使用 Spring 的依赖注入特性可以注入一个接口的多个实现这里采用 ListStrategy 的形式注入Spring 也支持通过 MapString,Strategy 的形式注入如果使用 Map 注入那么 key 就是类名小伙伴们自己也可以测试一下~
为方便调用我们需要将ListStrategy转换成MapStrategyType, Strategy结构业务执行时可以直接传递业务参数这里是我们定义的一个业务枚举StrategyType获取Bean。这里我们直接使用Spring的PostConstruct注解在方法上表示此方法是在Spring实例化该Bean之后马上执行此方法。
Service
public class StrategyFactory {private MapStrategyType, Strategy strategyMap new ConcurrentHashMap();Resourceprivate ListStrategy strategyList;public void execute(StrategyType type) {strategyMap.get(type).execute();}PostConstructpublic void init() {for (Strategy strategy : strategyList) {strategyMap.put(strategy.getType(), strategy);}}
}最后我们在业务类StrategyService直接使用就行了。
Service
public class StrategyService {Resourceprivate StrategyFactory strategyFactory;public void executeStrategy(StrategyType type) {strategyFactory.execute(type);}
}
最终结构如下所示 总结
使用 Spring 的依赖注入特性可以注入一个接口的多个实现很容易就实现了策略模式的选择这样后续添加一种策略的时候完全不需要改动主要逻辑只需添加具体实现即可。虽然我们是讲策略模式其实里面还包含了工厂模式。