0

责任链模式

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号
发表评论