Spring Boot 策略模式实战:优雅处理环节代码分发逻辑(含注解+默认策略)

在日常开发中,我们经常会遇到类似这样的需求:

"一个对象集合中有个字段(如环节代码 hjdm),需要根据这个字段的值执行不同的业务逻辑。"

最常见的写法就是 if-elseswitch,但当环节代码越来越多,逻辑越来越复杂,就会变得难以维护,耦合严重。

今天我们就用 策略模式 + 注解 + Spring 自动注入,打造一个 优雅、可扩展、低耦合 的环节代码分发框架。


🧱 项目结构概览

com.example.strategy
├── annotation
│   └── HjdmCode.java         // 自定义注解
├── factory
│   └── HjdmStrategyFactory.java
├── strategy
│   ├── HjdmStrategy.java     // 策略接口
│   ├── HjdmStrategyHJ01.java // HJ01策略实现
│   ├── DefaultStrategy.java  // 默认策略实现
├── model
│   └── YourObject.java       // 示例实体类
├── service
│   └── YourService.java
└── StrategyApp.java          // 启动类+测试

✅ 1. 自定义注解 @HjdmCode

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface HjdmCode {
    String value(); // 环节代码
    boolean isDefault() default false; // 是否为默认策略
}

✅ 2. 定义策略接口 HjdmStrategy

public interface HjdmStrategy {
    void handle(YourObject obj);
}

✅ 3. 示例实体类 YourObject

public class YourObject {
    private String hjdm;
    private String name;

    public YourObject(String hjdm, String name) {
        this.hjdm = hjdm;
        this.name = name;
    }

    public String getHjdm() { return hjdm; }
    public String getName() { return name; }
}

✅ 4. 策略实现类(多个)

HJ01 策略

@HjdmCode("HJ01")
public class HjdmStrategyHJ01 implements HjdmStrategy {
    public void handle(YourObject obj) {
        System.out.println("【HJ01】处理:" + obj.getName());
    }
}

默认策略

@HjdmCode(value = "DEFAULT", isDefault = true)
public class DefaultStrategy implements HjdmStrategy {
    public void handle(YourObject obj) {
        System.out.println("【默认处理】:" + obj.getName());
    }
}

✅ 5. 策略工厂类(自动注册)

@Component
public class HjdmStrategyFactory implements InitializingBean {

    @Autowired
    private List<HjdmStrategy> strategyList;

    private final Map<String, HjdmStrategy> strategyMap = new HashMap<>();
    private HjdmStrategy defaultStrategy;

    @Override
    public void afterPropertiesSet() {
        for (HjdmStrategy strategy : strategyList) {
            HjdmCode annotation = strategy.getClass().getAnnotation(HjdmCode.class);
            if (annotation != null) {
                strategyMap.put(annotation.value(), strategy);
                if (annotation.isDefault()) {
                    defaultStrategy = strategy;
                }
            }
        }
    }

    public HjdmStrategy getStrategy(String hjdm) {
        return strategyMap.getOrDefault(hjdm, defaultStrategy);
    }
}

✅ 6. 使用策略工厂处理业务

@Service
public class YourService {

    @Autowired
    private HjdmStrategyFactory factory;

    public void process(List<YourObject> list) {
        for (YourObject obj : list) {
            HjdmStrategy strategy = factory.getStrategy(obj.getHjdm());
            strategy.handle(obj);
        }
    }
}

✅ 7. 启动类测试效果

@SpringBootApplication
public class StrategyApp implements CommandLineRunner {

    @Autowired
    private YourService yourService;

    public static void main(String[] args) {
        SpringApplication.run(StrategyApp.class, args);
    }

    @Override
    public void run(String... args) {
        List<YourObject> list = List.of(
            new YourObject("HJ01", "张三"),
            new YourObject("HJ99", "未知环节") // 会走默认策略
        );

        yourService.process(list);
    }
}

✅ 输出效果

【HJ01】处理:张三
【默认处理】:未知环节

🔚 总结

通过这种策略模式+注解的方式:

  • 👌 解耦:每个环节逻辑分散,独立管理

  • 🔧 易扩展:新增环节只需加个类和注解

  • 🛡 容错强:支持默认策略防止崩溃

  • ✅ 更贴近业务语义,代码清晰可维护

👍 如果你也在处理复杂的分支逻辑,不妨试试这种模式,让代码更清爽!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jamie Chyi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值