场景简介

某开发部门出过一次严重的开发事故;新来的技术负责人小孙为此从产品->研发->测试->运维制定了一个流程,每个环节都需要相应的人员去检验负责,经过一段时间的磨合以后,产品的开发流程更加规范快捷,也鲜有事故发生了。

责任链模式:使多个对象都有机会处理请求,从⽽避免了请求的发送者和接受者之间的耦合关系。将这些对象连成⼀条链,并沿着这条链传递该请求,直到有对象处理它为⽌。

类图介绍

image-1669093386407

抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。

具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。

客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

代码示例

abstract class Handler {
    private Handler next;

    public Handler getNext() {
        return next;
    }

    public void setNext(Handler next) {
        this.next = next;
    }

    public abstract void handle();
}

class HandlerA extends Handler {
    @Override
    public void handle() {
        //判断是否处理以及如何处理
        System.out.println("handle a");
        if (getNext() != null) {
            getNext().handle();
        }
    }
}

class HandlerB extends Handler {
    @Override
    public void handle() {
        //判断是否处理以及如何处理
        System.out.println("handle b");
        if (getNext() != null) {
            getNext().handle();
        }
    }
}

public class HandlerDemo {
    public static void main(String[] args) {
        Handler handler = new HandlerA();
        handler.setNext(new HandlerB());
    }
}

责任链模式优缺点

优点

  • 将请求与处理解耦

  • 请求处理者(节点对象)只需关注自己感兴趣的请求进行处理即可,对于不感兴趣的请求,直接转发给下一个节点。

  • 具备链式传递处理请求功能,请求发送者无需知晓链路结构,只需等待请求处理结果。

  • 链路结构灵活,可以通过改变链路结构动态的新增或者删除责任。

  • 易于拓展新的请求处理类,符合开闭原则

缺点

  • 责任链太长或者处理时间太长,会影响整体性能

  • 如果节点对象存在循环引用会造成死循环,导致系统崩溃