在日常开发中,我们经常会遇到类似这样的需求:
"一个对象集合中有个字段(如环节代码 hjdm),需要根据这个字段的值执行不同的业务逻辑。"
最常见的写法就是 if-else
或 switch
,但当环节代码越来越多,逻辑越来越复杂,就会变得难以维护,耦合严重。
今天我们就用 策略模式 + 注解 + 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】处理:张三
【默认处理】:未知环节
🔚 总结
通过这种策略模式+注解的方式:
-
👌 解耦:每个环节逻辑分散,独立管理
-
🔧 易扩展:新增环节只需加个类和注解
-
🛡 容错强:支持默认策略防止崩溃
-
✅ 更贴近业务语义,代码清晰可维护
👍 如果你也在处理复杂的分支逻辑,不妨试试这种模式,让代码更清爽!