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);

    }
}

运行结果:
在这里插入图片描述
可以看到 One、Two、Three三个实现程序各司其职~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

timi先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值