设计模式(四)责任链模式——责任链模式结构

定义

责任链是行为型设计模式的一种,通过前一个处理者记录下一个处理者的方式形成一条处理链。客户端在调用时只需要将请求传递到责任上即可,无需关注链路中的具体的传递过程。而链路中内部的处理,是按照前一个处理者记录的下一个处理者依次执行。这样可以避免客户端调用方和多个处理者对象耦合。

责任链模式结构

  • 抽象处理器 :定义下一个处理器对象和处理方法,交给子类实现
  • 具体处理器 :继承抽象处理类,对处理方法按需实现。在处理方法的最后调用下一个处理器的处理方法。
  • 调用方 :组装处理器链,将调用请求发送给处理器链的顶端。

类图

代码实现

使用JavaSE代码实现责任链模式。

定义抽象处理器


/**
 * 抽象处理器
 *
 * @author lishuzhen
 * @createTime 2022年06月09日 21:22:00
 */
public abstract class AbstractHandler {

    private AbstractHandler nextHandler;

    /**
     * 定义抽象方法,执行具体的计算逻辑
     *
     * @return
     */
    abstract public Object doFilter();


    public AbstractHandler getNextHandler() {
        return nextHandler;
    }

    public void setNextHandler(AbstractHandler nextHandler) {
        this.nextHandler = nextHandler;
    }
}

定义具体的处理器实现类

/**
 * A处理器实现
 *
 * @author lishuzhen
 * @createTime 2022年06月09日 21:23:00
 */
public class AHandler extends AbstractHandler {

    /**
     * 定义抽象方法,执行具体的计算逻辑
     *
     * @return
     */
    @Override
    public Object doFilter() {
        System.out.println("A doSomething");
        if (getNextHandler() != null) {
            // 如果存在下一个处理器,则继续向下调用
            return getNextHandler().doFilter();
        }
        return new Object();
    }
}

/**
 * B处理器实现
 *
 * @author lishuzhen
 * @createTime 2022年06月09日 21:23:00
 */
public class BHandler extends AbstractHandler {

    /**
     * 定义抽象方法,执行具体的计算逻辑
     *
     * @return
     */
    @Override
    public Object doFilter() {
        System.out.println("B doSomething");
        if (getNextHandler() != null) {
            // 如果存在下一个处理器,则继续向下调用
            return getNextHandler().doFilter();
        }
        return new Object();
    }
}

定义调用方

public class ClientDemo {

    public static void main(String[] args) {
        // 构建A处理器对象
        AHandler aHandler = new AHandler();
        // 构建A处理器对象
        BHandler bHandler = new BHandler();

        // 组装处理器链, A处理器作为第一个处理器, 为A处理器设置下一个处理器
        aHandler.setNextHandler(bHandler);

        // 将请求发送给处理器链的顶端
        aHandler.doFilter();
    }
}

执行main方法

控制台打印日志如下,说明程序按照demo中设定好的 A -> B 顺序正确执行。

A doSomething
B doSomething

总结

优点

  • 降低了各个处理器之间的耦合,各处理器只关注处理自身的内部逻辑,然后抛给下一个处理器即可。不需要关注具体的上下游调用关系。
  • 提高可扩展性,可在组装处理器链时对链路进行扩展。
  • 可灵活调整各处理器之间的调用顺序

缺点

  • 调用方需要组装处理器链,虽然降低了处理器间的耦合,但是组装链时却存在耦合。(下一篇博文中会提出通过spring容器来解决创建链的问题)
  • 会增加程序的复杂度,需评估酌情使用,不可为了设计模式而用设计模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值