Skip to content

责任链模式

GitHubJava

📖 概述

概述:

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

责任链模式通过将多个处理器(处理对象)以链式结构连接起来,使得请求沿着这条链传递,直到有一个处理器处理该请求为止。

责任链模式允许多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求。

也就是说,我们可以构造一个链表的结构,这个链表可以对请求进行处理,节点之前互相隔离,请求和处理服务之间通过这个链条解耦,也可以添加上下文来增加联通的功能

🔗 相关资源


🔗 单例责任链

栗子:

LogicHandler: 作为责任链处理器,定义了处理方法

java
/**
 * @Author BanXia
 * @description: 处理器
 * @Date 2026/1/20 18:47
 */
public interface LogicHandler<T, D, R> {

    /**
     *  处理
     * @param requestParameter 请求参数
     * @param dynamicContext 动态上下文
     * @return 处理结果
     * @throws Exception 处理异常
     */
    R apply(T requestParameter, D dynamicContext) throws Exception;
}

LogicMapper: 作为责任链的路由,提供了添加下一节点和获取下一节点的方法

java
/**
 * @Author BanXia
 * @description:
 * @Date 2026/1/20 18:51
 */
public interface LogicMapper<T, D, R> {

    /**
     * 获取规则处理器
     * @param requestParameter 请求参数
     * @param dynamicContext 动态上下文
     * @return 规则处理器
     * @throws Exception 获取规则处理器异常
     */
    LogicHandler<T, D, R> getNext(T requestParameter, D dynamicContext) throws Exception;

    /**
     * 添加规则处理器
     * @param ruleHandler 规则处理器
     * @return 添加结果
     * @throws Exception 添加规则处理器异常
     */
    LogicHandler<T, D, R> addNext(LogicHandler<T, D, R> ruleHandler) throws Exception;
}

AbstractLogicLink: 作为责任链的抽象类,实现上述两个接口

java
/**
 * @Author BanXia
 * @description: 抽象责任链类
 * @Date 2026/1/20 19:00
 */
public abstract class AbstractLogicLink<T, D, R> implements LogicHandler<T, D, R>, LogicMapper<T, D, R>{

    private LogicHandler<T, D, R> next;

    @Override
    public LogicHandler<T, D, R> addNext(LogicHandler<T, D, R> ruleHandler) throws Exception {
        return next = ruleHandler;
    }

    @Override
    public LogicHandler<T, D, R> getNext(T requestParameter, D dynamicContext) throws Exception {
        return next;
    }
}

LogicLink1、LogicLink2: 作为抽象类的实现,实现最后的处理方法

问题:

问题显而易见,如果我有两个责任链,而这两个责任链需要同一个节点来处理,而且这两条责任链的下一个节点还不一样,这就会产生问题了,一个节点的next会被改来改去,就废了

于是我们可以用多例责任链

🔄 多例责任链

多例责任链的核心就是解耦链路和执行,将这两个分开,我们可以把执行的部分放到列表中,执行的时候遍历这个列表就可以了

Contact me: 1943284256@qq.com

🔄
选择季节效果
🔄自动切换
🌸春季花瓣
🌧️夏季雨滴
🍂秋季落叶
❄️冬季雪花