Java 责任链模式

简介: 责任链模式定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

一、什么是责任链模式

责任链模式定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

可以将它想象成一个管道,请求会顺着管道一段一段被传递,直到被处理。

二、责任链模式的优势和劣势

2.1 优势

  • 解耦
  • 扩展性高
  • 简化链接
  • 分担责任

    2.2 劣势

  • 可能请求到最末端也未得到处理
  • 链中程序过多会影响性能
  • 增加了客户端的复杂度

三、示例

我们来一段代码展示一下:

首先我们定义一个抽象类,这个类中定义我们要实现的逻辑的抽象实现和传输逻辑:

public abstract class Handler {
   
   
    //用它打印日志
    private static final Logger log = LoggerFactory.getLogger(Handler.class);

    //定义一个要传递的参数
    private final int num;

    //参数获取
     Handler(int num) {
   
   
        this.num = num;
    }

    private Handler nextHandler;

    //链接
    public void setNextHandler(Handler nextHandler) {
   
   
        this.nextHandler = nextHandler;
    }

    public final void submit(int i) {
   
   
        if (i == num) {
   
   
            //调用处理方法
            this.handleLeave(i);
            //不往下传递请求时打印这个
            log.info("流程结束!!!");
        }else if(this.nextHandler == null) {
   
   
            //到最末端仍未处理请求打印这个
            log.info("责任链中没有处理该数字的程序");
        }else{
   
   
            this.nextHandler.submit(i);
        }
    }
    protected abstract void handleLeave(int i);

}

接着定义三个实现类,实现抽象类中的方法:

实现类 One:

public class One extends Handler{
   
   

    private static final Logger oneLog = LoggerFactory.getLogger(One.class);

    public One() {
   
   
        super(1);
    }
    @Override
    protected void handleLeave(int leave) {
   
   
        //One 执行的逻辑
        oneLog.info("打印数字 1");
    }
}

实现类 Two:

public class Two extends Handler {
   
   

    private static final Logger TwoLog = LoggerFactory.getLogger(Two.class);

    public Two() {
   
   
        super(2);
    }

    @Override
    protected void handleLeave(int leave) {
   
   
        //Two 执行的逻辑
        TwoLog.info("打印数字 2");
    }
}

实现 Three:

public class Three extends Handler {
   
   
    private static final Logger ThreeLog = LoggerFactory.getLogger(Three.class);

    public Three() {
   
   
        super(3);
    }

    @Override
    protected void handleLeave(int leave) {
   
   
        //Three 执行的逻辑
        ThreeLog.info("打印数字 3");
    }
}

最后写一个客户端测试一下:

public class Client {
   
   
    public static void main(String[] args) {
   
   

        // 处理 3
        Three three = new Three();
        // 处理 2
        Two two = new Two();
        // 处理 1
        One one = new One();

        three.setNextHandler(two);
        two.setNextHandler(one);

        //提交
        three.submit(1);
        three.submit(2);
        three.submit(3);

    }
}

运行结果:
21174716589c4167b1c37af6c07b3eeb.png

可以看到 One、Two、Three三个实现程序各司其职~

目录
相关文章
|
1月前
|
设计模式 Dubbo Java
聊聊Java设计模式-责任链模式
责任链模式(Chain Of Responsibility Design Pattern),也叫做职责链,是将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
95 1
聊聊Java设计模式-责任链模式
|
30天前
|
设计模式 Java
Java责任链模式
Java责任链模式
25 0
|
1月前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Chain of responsibility(责任链模式)
【设计模式】JAVA Design Patterns——Chain of responsibility(责任链模式)
|
1月前
|
设计模式 Java
23种设计模式,责任链模式的概念优缺点以及JAVA代码举例
【4月更文挑战第7天】责任链模式是一种行为设计模式,它允许将请求沿着处理者链进行传递,直到有对象处理该请求为止。这种模式提供了一种解耦请求的发送者和接收者之间的方式,通过给多个对象处理一个请求的机会,减少了对象间的耦合度。
16 1
|
1月前
|
设计模式 Java
Java责任链模式
Java责任链模式
21 0
|
10月前
|
设计模式 Java 数据库连接
java设计模式---责任链模式详解
java设计模式---责任链模式详解
97 0
|
1月前
|
设计模式 Java
Java设计模式【十四】:责任链模式
Java设计模式【十四】:责任链模式
36 0
|
8月前
|
设计模式 Java 应用服务中间件
【设计模式——学习笔记】23种设计模式——职责链/责任链模式(Chain of Responsibility)(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——职责链/责任链模式(Chain of Responsibility)(原理讲解+应用场景介绍+案例介绍+Java代码实现)
94 0
|
10月前
|
设计模式 Java
|
11月前
|
设计模式 SpringCloudAlibaba 算法
Java设计模式(一):责任链模式
将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。实际上,责任链模式还有一种变体,那就是请求会被所有接收对象都能处理一遍,直到某个接收对象不能正常处理再退出,或者全部执行一遍,不存在中途终止的情况
201 0
Java设计模式(一):责任链模式