设计模式是为了可扩展性,不要为了使用设计模式而使用
概念
责任链模式(Chain of Responsibility): 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止
像我们日常使用的spring框架中的拦截器和过滤器都是使用了该模式,每次请求都会经过一系列的拦截,只有当前面的拦截通过后才会进入下一步
责任链模式包含如下角色:
- Handler: 抽象处理者,处理请求的接口类包含抽象处理方法和一个后继连接
- Concrete Handler: 实现抽象处理者的处理类,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者
- Client: 创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程
抽象的处理者实现三个职责:
- 一是定义一个请求的处理方法handleMessage,唯一对外开放的方法;
- 二是定义一个链的编排方法setNext,设置下一个处理者;
- 三是定义了具体的请求者必须实现的两个方法:定义自己能够处理的级别getHandlerLevel和具体的处理任务echo。
注意事项:
链中节点数量需要控制,避免出现超长链的情况,一般的做法是在Handler中设置一个最大节点数量,在setNext方法中判断是否已经是超过其阈值,超过则不允许该链建立,避免无意识地破坏系统性能
JavaEE的Servlet规范定义的Filter就是一种责任链模式,它不但允许每个Filter都有机会处理请求,还允许每个Filter决定是否将请求“放行”给下一个Filter,这种模式不但允许一个Filter自行决定处理ServletRequest和ServletResponse,还可以“伪造”ServletRequest和ServletResponse以便让下一个Filter处理,能实现非常复杂的功能
使用场景
审批流程、多轮面试等需要多级处理的场景都适合使用责任链模式来实现,可解决大量的分支判断造成难维护、灵活性差的问题