在日常开发中,我们经常会面临很多 if-else 的代码,为了提升代码的可维护性、让代码更优雅,我们可以尝试使用策略 + 工厂设计模式。下面是一个使用模版,我们在开发的时候直接套用就行了。
定义一个策略接口,这个接口将由不同的策略实现:
public interface XxxStrategy {
/**
* 执行的方法
*/
void execute();
/**
* 获取类型。比如 1 -> 策略A,2 -> 策略B
*/
int getType();
}
@Component
public class AStrategy implements XxxStrategy {
@Override
public void execute() {
System.out.println("Executing AStrategy");
}
@Override
public int getType() {
return 1;
}
}
@Component
public class BStrategy implements XxxStrategy {
@Override
public void execute() {
System.out.println("Executing BStrategy");
}
@Override
public int getType() {
return 2;
}
}
// ... 更多策略类 ...
@Component
public class XxxStrategyFactory {
private final Map<Integer, XxxStrategy> strategies;
@Autowired
public XxxStrategyFactory(List<XxxStrategy> strategyList) {
this.strategies = new HashMap<>();
strategyList.forEach(strategy -> strategies.put(strategy.getType(), strategy));
}
public XxxStrategy getStrategy(int type) {
return strategies.get(type);
}
}
在 XxxStrategyFactory
这个工厂类中,我们利用构造器注入机制汇集了所有 XxxStrategy
接口的实现类。这些实现类根据自身定义的 type
属性被组织在一个映射表中,使得我们可以通过特定的 type
快速访问相应的策略对象。
加上 @Autowired
注解的构造方法使得Spring能够自动完成依赖注入,将所有 XxxStrategy
的实现类实例化为一个列表并传递给构造器。这一列表随后被遍历,以创建 type
到策略实例的映射。
从 Spring 4.3 版本起,单构造函数的类不必显式使用 @Autowired
注解,因为 Spring 默认会对这个唯一的构造函数应用自动依赖注入。
@RestController
@RequestMapping("/api")
public class XxxController {
@Autowired
private XxxStrategyFactory strategyFactory;
@GetMapping("/xxx/{type}")
public ResponseEntity<?> xxx(@PathVariable int type) {
XxxStrategy strategy = strategyFactory.getStrategy(type);
if (strategy != null) {
strategy.execute();
return ResponseEntity.ok().build();
}
return ResponseEntity.badRequest().body("Invalid type provided");
}
}
在这个XxxController
中,我们定义了一个xxx
方法,这个方法通过路径变量接收type
,然后使用策略工厂来获取对应的策略实现,并执行它。
我是 xiucai,一位后端开发工程师。
如果你对我感兴趣,请移步我的[个人博客](https://blog.xiucaicoder.cn/),进一步了解。
- 文中如有错误,欢迎在评论区指正,如果这篇文章帮到了你,欢迎点赞和关注😊
- 本文首发于个人博客,未经许可禁止转载💌