项目中使用到责任链模式重构代码,每个责任的链路中需要引用其他服务方法。按一般责任链的写法是new 链路对象,此时则不适用。
主要思路是采用接口+Ordered类。
接口:
public interface BaseHandler extends Ordered {
boolean doHandle(InputDTO inputDto);
}
链路实现:
@Component
public class FirstHandler implements BaseHandler {
@Autowired
private MyService myService;
@Override
public boolean doHandle(InputDTO inputDto) {
// 代码实现
...
}
// 链路的顺序靠getOrder返回值得顺序决定
@Override
public int getOrder() {
retrun 1;
}
}
@Component
public class SecondHandler implements BaseHandler {
@Autowired
private MyService myService;
@Override
public boolean doHandle(InputDTO inputDto) {
// 代码实现
...
}
// 链路的顺序靠getOrder返回值得顺序决定
@Override
public int getOrder() {
retrun 2;
}
}
链路想加几个加几个,另外doHandle()方法中,设计为return true跳出责任链,return false继续执行责任链。
@Component
public class HandlerChain {
private final List<BaseHandler> baseHandlers;
public HandlerChain(List<BaseHandler> baseHandlers) {
//责任链的链路排序,确保链路顺序
baseHandlers.sort(Comparator.comparing(BaseHandler::getOrder));
this.baseHandlers = Collections.unodifiableList(baseHandlers);
}
public final void handle(InputDTO inputDto) {
boolean handle = false;
for (BaseHandler baseHandler : baseHandlers) {
if (!handle) {
handle = baseHandler.doHandle(inputDto);
}
}
}
}
代码中使用:
public class Service {
@Autowired
private HandlerChain handlerChain;
public OutputDTO serviceName(InputMsg inputMsg) {
InputDTO inputDto = new InputDTO();
// 给inputDto赋值
...
// 调用责任链
handlerChain.handle(inputDto);
...
}
}