设计模式之【 策略模式】

张开发
2026/4/18 2:33:37 15 分钟阅读

分享文章

设计模式之【 策略模式】
SpringBoot 策略模式实战解耦多场景业务处理优雅替代 if-else在日常后端开发中我们经常会遇到根据不同类型执行不同业务逻辑的场景比如不同支付方式、不同文件解析、不同数据处理策略等。传统写法会堆砌大量if-else/switch代码臃肿、扩展性极差新增策略时还需要修改原有代码违反开闭原则。本文将基于 SpringBoot手把手实现策略模式 Spring 自动注入的优雅方案解耦业务逻辑让代码更易维护、易扩展。一、需求分析我们需要实现一个通用的策略调用框架定义抽象策略接口规范所有业务策略的行为每个业务场景对应一个策略实现类独立封装业务逻辑通过 Spring 自动管理所有策略类无需手动注册提供统一调用入口根据传入的类型参数自动匹配并执行对应策略。二、核心技术栈SpringBoot依赖注入、自动装配策略模式设计模式核心Java 8 Stream简化策略匹配逻辑GsonJSON 序列化 / 反序列化可替换为 Fastjson/Jackson三、代码实现定义抽象策略接口首先创建抽象类TStrategy定义两个核心抽象方法supportedType()声明当前策略支持的处理类型用于匹配callMethod()具体业务逻辑执行方法/** * 抽象策略类 * 定义所有策略的通用行为 */publicabstractclassTStrategy{/** * 策略支持的类型标识 * return 类型字符串 */publicabstractStringsupportedType();/** * 策略执行方法 * param entity 入参JSON字符串 * param className1 扩展参数可根据业务调整 * return 执行结果JSON字符串 */publicabstractStringcallMethod(Stringentity,StringclassName1);}创建具体策略实现类每个业务场景对应一个策略实现类只关注自身业务逻辑通过Component交给 Spring 管理。以CutStrategyPonEntity 数据处理策略为例importcom.google.gson.Gson;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;/** * 具体策略实现类PonEntity 数据处理策略 */ Component Slf4j public class CutStrategy extends TStrategy{// 注入业务Controller/Service执行业务逻辑 Autowired private TController tController;/** * 声明当前策略支持的类型 */ Override public StringsupportedType(){returnPonEntity;}/** * 具体业务执行逻辑 */ Override public String callMethod(String entityStr, String className1){Gson gsonnew Gson();// JSON转实体类 PonEntity entitygson.fromJson(entityStr, PonEntity.class);try{// 执行业务逻辑示例可调用Controller/Service方法 log.info(CutStrategy 执行PonEntity数据处理{}, entity);// 业务代码编写位置}catch(Exception e){log.error(PonEntity数据处理异常, e);}// 返回结果returngson.toJson(entity);}}扩展新策略只需要新增类继承TStrategy实现方法并添加Component即可无需修改任何原有代码。示例新增PreStrategy策略Component Slf4j public class PreStrategy extends TStrategy{Override public StringsupportedType(){returnPreEntity;}Override public String callMethod(String entityStr, String className1){Gson gsonnew Gson();PreEntity entitygson.fromJson(entityStr, PreEntity.class);try{log.info(PreStrategy 执行PreEntity数据处理);// 自定义业务逻辑}catch(Exception e){log.error(PreEntity数据处理异常, e);}returngson.toJson(entity);}}策略上下文方法连通器创建TContext作为统一调用入口利用 Spring 的自动注入特性将所有TStrategy的实现类直接注入到 List 中。通过 Java 8 Stream 快速匹配对应策略屏蔽策略选择细节importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;importjava.util.List;/** * 策略上下文统一调用入口 * 自动注入所有策略根据类型匹配并执行 */ Component public class TContext{/** * Spring自动注入 所有TStrategy的实现类 * 无需手动添加新增策略后自动生效 */ Autowired private ListTStrategytStrategies;/** * 统一调用方法 * paramtype策略类型与supportedType对应 * param data 入参JSON * param classname1 扩展参数 * return 执行结果 */ public String productionT(String type, String data, String classname1){returnthis.getStrategy(type).callMethod(data, classname1);}/** * 根据类型匹配对应的策略 * paramtype策略类型 * return 匹配到的策略实现类 */ private TStrategy getStrategy(Stringtype){returntStrategies.stream().filter(strategy -type.equals(strategy.supportedType())).findFirst()// 未匹配到策略时抛出异常避免空指针 .orElseThrow(()-new IllegalArgumentException(未找到对应的处理策略type));}}业务调用在业务代码中直接注入TContext传入策略类型和参数即可自动执行对应逻辑Autowired private TContext context;// 业务调用示例 public voidtestStrategy(){// 构造测试数据 PreEntity preEntitynew PreEntity();preEntity.setId(1);preEntity.setName(测试数据);// 调用策略传入类型JSON参数自动匹配PreStrategy String resultcontext.productionT(PreEntity, new Gson().toJson(preEntity),);log.info(策略执行结果{}, result);}四、代码优化点必看异常优化原代码使用get()会在无匹配策略时抛出NoSuchElementException替换为orElseThrow()自定义异常更友好解耦增强策略类完全独立新增 / 删除策略不影响其他代码符合开闭原则依赖注入Spring 自动管理所有策略无需手动维护策略集合扩展性callMethod参数可根据业务自由调整支持任意复杂业务逻辑。五、方案优势消除 if-else彻底告别臃肿的条件判断代码更简洁高扩展性新增策略只需新增类 实现方法零修改原有代码业务解耦每个策略独立封装便于单元测试和维护Spring 无缝整合利用框架特性简化策略注册和管理。六、适用场景多种支付方式微信 / 支付宝 / 银行卡多种文件解析Excel/PDF/Word多种消息推送短信 / 邮件 / 站内信不同数据格式处理如本文示例流程审批、订单状态处理等多分支业务七、总结SpringBoot 策略模式是处理多类型分支业务的最优解之一通过抽象接口定义规范、实现类封装业务、上下文统一调度让代码结构更清晰、扩展性拉满。相比于传统的 if-else 写法这种方案不仅提升了代码质量更能适配业务快速迭代的需求是后端开发必备的设计模式实战技巧。

更多文章