责任链模式实现链路中注入服务

前言

项目中使用到责任链模式重构代码,每个责任的链路中需要引用其他服务方法。按一般责任链的写法是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);
		...
	}
}

你可能感兴趣的:(C1-Java)