2024.10.11 | cuithink | 1281次围观
避免将一个请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求.
将接收请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止
将请求和请求的处理进行解耦,提高代码的可扩展性.
职责链模式主要包含以下角色:
抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接(链上的每个处理者都有一个成员变量来保存对于下一处理者的引用,比如上图中的successor) 。
具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。
实际的开发中,并不会采用这种标准的责任链结构,而是会进行一些改变,比如增加一个责任链管理者,来管理这些具体的处理者
代码实现
//处理者接口,用于标准化执行 public interface OrderHandleIntercept { //指定执行顺序 int sort(); //对参数进行处理 OrderContext handle(OrderContext context); } //创建具体处理者类,我们分别创建三个不同的接口实现类,并指定执行顺序 @Component public class RepeatOrderHandleInterceptService implements OrderHandleIntercept { @Override public int sort() {return 1;//执行顺序为 1} @Override public OrderContext handle(OrderContext context) { System.out.println("通过seqId,检查客户是否重复下单"); return context; } } //还有两个类省略 //处理器链类,用于管理上面的这几个实现类 //整个针对请求的处理过程,都通过HandleChain进行管理,对于发送请求的客 //户端来说,只需要调用HandleChain,并将请求交给HandleChain处理就可以了 @Component public class OrderHandleChainService implements ApplicationContextAware { //保存责任链中的处理者 private List<OrderHandleIntercept> handleList = new ArrayList<>(); @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { //获取指定接口实现类,并按照sort进行排序,放入List //getBeansOfType这个方法能返回一个接口的全部实现类(前提是所有实现类都必须由Spring IoC容器管理) Map<String, OrderHandleIntercept> serviceMap = applicationContext.getBeansOfType(OrderHandleIntercept.class); handleList = serviceMap.values().stream() .sorted(Comparator.comparing(OrderHandleIntercept::sort)) .collect(Collectors.toList()); } //执行处理 public OrderContext execute(OrderContext context){ for (OrderHandleIntercept handleIntercept : handleList) { context = handleIntercept.handle(context); } return context; } }
使用场景
在运行时要使用多个对象对一个请求进行处理
不想让使用者知道具体的处理逻辑
粤ICP备16076548号
发表评论