2024.10.11 | cuithink | 1960次围观
避免将一个请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求.
将接收请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止

将请求和请求的处理进行解耦,提高代码的可扩展性.
职责链模式主要包含以下角色:
抽象处理者(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号

发表评论