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

本文介绍了如何在责任链模式中实现服务注入。通过接口和Ordered类,可以灵活地添加和管理链路对象,其中doHandle()方法的返回值决定是否继续执行责任链。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值