最近有需求改造一块老代码,目的是为了把一块公司相关的特殊逻辑抽成common的一种机制。我上来想到使用类似策略模式的方法,把代码设计成一个枚举类,满足要求就可以使用相应特殊策略,如图:

后来跟东哥交流之后,他提出由于具体执行策略的方法比较长,里面可能涉及比较多的service,使用枚举类之后就都变成静态的了,无法使用spring自动注入的功能,也不利于test的mock。在他的指导下,我使用了Spring的ApplicationContext,在service的PostConstruct注解中注册不同公司的具体策略,这样就可以使用spring来帮助自动注入,非常神奇非常强大,有空还是要好好研究下spring的框架。
public class ExceptionFeedbackSpecialServiceImpl implements ExceptionFeedbackSpecialService {
private List<ExceptionFeedbackSpecialProcess> processList = new ArrayList<>();
@Resource
private ApplicationContext applicationContext;
@Override
public void handleSpecialFeedbackProcessor(Order order, FeedbackTriggerInfo triggerInfo) {
for (ExceptionFeedbackSpecialProcess process : processList) {
try {
if (process.isMatchSpecialRequirement(order, triggerInfo)) {
process.handleSpecialProcessor(order, triggerInfo);
}
} catch (Exception e) {
LoggerFactory.getExceptionLogger().logException(e);
}
}
}
@PostConstruct
public void register() {
HuntsmanExceptionFeedbackProcess huntsmanExceptionFeedbackProcess = applicationContext.getAutowireCapableBeanFactory().createBean(HuntsmanExceptionFeedbackProcess.class);
processList.add(huntsmanExceptionFeedbackProcess);
DcsExceptionFeedbackProcess dcsExceptionFeedbackProcess = applicationContext.getAutowireCapableBeanFactory().createBean(DcsExceptionFeedbackProcess.class);
processList.add(dcsExceptionFeedbackProcess);
}
}
网友评论