23种设计模式-责任链(Chain of Responsibility)设计模式

🚩什么是责任链设计模式?

责任链设计模式(Chain of Responsibility Pattern) 是一种 行为型设计模式,它允许多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。

使用场景

  • 当需要 多个对象可以处理同一个请求,但具体由哪个对象处理在运行时动态决定时

  • 当需要 在不明确指定接收者的情况下向多个对象中的一个提交请求

  • 当需要 动态指定一组对象处理请求 时(如审批流程、异常处理等)

🚩责任链设计模式的特点

  • 解耦请求发送者和接收者:发送者无需知道具体由哪个对象处理请求

  • 动态组合处理链:可以动态地添加或修改处理请求的责任链

  • 灵活性高:可以灵活地分配责任或改变处理顺序

  • 多种处理方式:请求可以被链中的某个对象处理,也可以不被任何对象处理

🚩责任链设计模式的结构

责任链模式主要包含以下部分:

  • Handler(抽象处理者):定义处理请求的接口,通常包含设置下一个处理者的方法和处理请求的方法

  • ConcreteHandler(具体处理者):实现处理请求的具体逻辑,如果不能处理则转发给下一个处理者

  • Client(客户端):创建处理链并向链头的处理者提交请求

图例:

在这里插入图片描述

🚩责任链设计模式的优缺点

✅ 优点

  • 降低耦合度:请求发送者只需知道链中的第一个处理者

  • 增强灵活性:可以动态地增加或修改处理链

  • 简化对象间的连接:每个处理者只需保持一个指向其后继者的引用

  • 分配责任更灵活:可以自由分配责任或改变责任顺序

❌ 缺点

  • 请求可能不被处理:如果没有处理者能够处理请求,它可能会到达链的末端并被丢弃

  • 性能问题:较长的责任链可能会影响性能,特别是在链的末端才找到处理者时

  • 调试困难:请求的传递过程可能比较复杂,不容易调试

🚩责任链设计模式的Java实现

代码地址:GitHub

  • 创建 抽象主题 Handler接口
/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName Handler
 * @Description 抽象类定义了处理请求的接口和设置下一个处理者的方法
 * @date 2025/3/25 15:45
 **/
public abstract class Handler {
    protected Handler next;

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

    public abstract void HandlerRequest(int request);
}
  • 创建三个具体的处理者,实现自己的逻辑

    • FuDaoYuan处理者
    /**
     * @author hanson.huang
     * @version V1.0
     * @ClassName FuDaoYuan
     * @Description FuDaoYuan处理者
     * @date 2025/3/25 15:47
     **/
    public class FuDaoYuan extends Handler { // <= 7 审批
    
        @Override
        public void HandlerRequest(int request) {
            if (request <= 7) {
                System.out.println("辅导员审批通过");
            } else {
                if (next != null) {
                    next.HandlerRequest(request);
                } else {
                    System.out.println("无法审批");
                }
            }
        }
    }
    
    • YuanZhang处理者
    /**
     * @author hanson.huang
     * @version V1.0
     * @ClassName YuanZhang
     * @Description YuanZhang处理者
     * @date 2025/3/25 15:51
     **/
    public class YuanZhang extends Handler {
    
        @Override
        public void HandlerRequest(int request) {
            if (request <= 15) {
                System.out.println("院长审批通过");
            } else {
                if (next != null) {
                    next.HandlerRequest(request);
                } else {
                    System.out.println("无法审批");
                }
            }
        }
    }
    
    • XiaoZhang处理者
    /**
     * @author hanson.huang
     * @version V1.0
     * @ClassName XiaoZhang
     * @Description XiaoZhang处理者
     * @date 2025/3/25 15:52
     **/
    public class XiaoZhang extends Handler {
    
        @Override
        public void HandlerRequest(int request) {
            if (request <= 30) {
                System.out.println("校长审批通过");
            } else {
                if (next != null) {
                    next.HandlerRequest(request);
                } else {
                    System.out.println("无法审批");
                }
            }
        }
    }
    
  • 测试责任链模式

/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName ChainOfResponsibilityPattern
 * @Description 测试责任链模式
 * @date 2025/3/25 15:54
 **/
public class ChainOfResponsibilityPattern {
    public static void main(String[] args) {
        FuDaoYuan fuDaoYuan = new FuDaoYuan();
        YuanZhang yuanZhang = new YuanZhang();
        XiaoZhang xiaoZhang = new XiaoZhang();

        fuDaoYuan.setNext(yuanZhang);
        yuanZhang.setNext(xiaoZhang);

        fuDaoYuan.HandlerRequest(31);
        fuDaoYuan.HandlerRequest(25);
    }
}

📌 运行结果

传入31时,显示无法审批
传入25时,校长审批通过

在这里插入图片描述

🚩代码总结

  • Handler 抽象类定义了处理请求的接口和设置下一个处理者的方法

  • FuDaoYuanYuanZhangXiaoZhang 是具体的处理者,实现了自己的处理逻辑

  • ChainOfResponsibilityPattern 类构建了处理链并触发请求

  • 每个处理者如果不能处理当前请求,会将请求传递给链中的下一个处理者

🚩总结

  • 责任链设计模式 通过构建一条处理链来解耦请求发送者和接收者

  • 核心是 让多个对象都有机会处理请求,避免请求发送者与接收者之间的耦合

  • 适用于 多级审批、异常处理、事件传递 等场景

✅ Java源码中的应用场景:

  1. Java Servlet中的FilterChain

    • javax.servlet.FilterChain

    • 多个Filter组成责任链处理HTTP请求

  2. Java异常处理机制:

    • 异常在调用栈中向上传播的过程就是责任链模式的应用
  3. Spring Security的过滤器链:

    • 多个安全过滤器组成责任链处理安全相关逻辑
  4. Netty的ChannelPipeline:

    • 处理器链处理网络事件
  5. AWT/Swing事件处理:

    • 事件在组件层次结构中的传播
  6. Log4j/Logback日志框架:

    • 日志级别过滤和处理的链式结构

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

在这里插入图片描述

<think>好的,我现在需要回答用户关于责任链设计模式的问题,包括概念、实现方式、应用场景以及示例代码的解释。首先,我需要回顾责任链模式的基本概念,确保自己理解正确。根据提供的引用资料,责任链模式允许为请求创建一个对象链,每个对象处理请求或传递给下一个。这可能用于处理不同校验步骤,比如用户注册时的验证。 接下来是实现方式。通常,责任链模式涉及一个处理器的抽象类或接口,定义处理方法和设置下一个处理者的方法。具体的处理者继承并实现处理方法,决定是否处理请求或传递给下一个。需要确保示例代码符合这个结构,比如用户名校验器、密码校验器等。 应用场景方面,引用中提到适合多级请求处理、动态指定处理对象的情况,例如中间件、事件传递。需要结合实际例子说明,比如Web框架的中间件链或审批流程。 示例代码部分,用户提供了校验用户账户的例子。需要检查代码结构是否正确,每个校验器是否继承自父类,是否调用下一个处理者。可能需要指出代码中的关键部分,如校验方法中的处理逻辑和链式调用。 注意事项方面,要提到链的构建方式,处理者的顺序可能影响结果,以及潜在的性能问题,比如链过长导致的延迟。 最后,生成相关问题时要围绕责任链模式的优缺点、与其他模式的区别、实际应用案例等。确保问题有助于用户深入理解模式的使用和限制。 现在需要将这些思考整理成结构化的回答,确保各部分清晰,代码示例正确,引用适当。同时,使用中文,并遵循LaTeX格式的要求,数学表达式用$...$,独立公式用$$...$$。避免使用Markdown,保持自然口语化。</think>### 责任链设计模式解析 #### 一、核心概念 责任链模式Chain of Responsibility Pattern)是一种行为型设计模式,允许将请求沿着处理链传递,每个处理节点决定处理请求或传递给下一个节点[^2]。其核心结构包含: - **抽象处理者**:定义处理请求的接口,包含设置下一个处理者的方法 - **具体处理者**:实现具体的处理逻辑,决定是否处理或传递请求 - **请求对象**:封装请求的上下文信息 #### 二、Python实现示例 以下代码演示用户注册时的多级校验流程: ```python # 1. 用户账户类(请求对象) class UserAccount: def __init__(self, username, password, phone): self.username = username self.password = password self.phone = phone # 2. 抽象校验器(抽象处理者) class Validator: _next = None def set_next(self, validator): self._next = validator return validator # 支持链式调用 def validate(self, user): if self._next: return self._next.validate(user) return True # 链尾默认返回成功 # 3. 具体校验器实现(具体处理者) class UsernameValidator(Validator): def validate(self, user): if not user.username.isalnum(): print("用户名必须为字母数字组合") return False return super().validate(user) class PasswordValidator(Validator): def validate(self, user): if len(user.password) < 8: print("密码长度需≥8位") return False return super().validate(user) class PhoneValidator(Validator): def validate(self, user): if not user.phone.startswith("1") or len(user.phone) != 11: print("手机号格式错误") return False return super().validate(user) # 4. 客户端调用 if __name__ == "__main__": # 构建处理链 validator = UsernameValidator() validator.set_next(PasswordValidator()).set_next(PhoneValidator()) # 测试用例 test_user = UserAccount("user#123", "12345", "1380013800") print("校验结果:", validator.validate(test_user)) # 输出:False ``` #### 三、关键实现点 1. **链式构建**:通过`set_next()`实现动态组合处理链 ```python validator.set_next(B).set_next(C) # 形成A→B→C的链 ``` 2. **传递机制**:`super().validate(user)`触发链式传递 3. **提前终止**:任一节点返回`False`时立即终止流程 #### 四、典型应用场景 1. **多级校验系统**:如表单验证、权限检查 2. **请求处理中间件**:如Web框架的过滤器链(身份认证→日志记录→参数校验) 3. **事件传递系统**:GUI中的事件冒泡机制 4. **审批工作流**:采购审批的多级审批流程 #### 五、模式优缺点 ✅ **优势**: - 符合开闭原则:新增处理者无需修改现有代码 - 动态调整处理顺序:通过修改链结构灵活配置 - 解耦请求发送者与接收者 ❌ **局限**: - 请求可能未被处理(需设置兜底处理) - 调试复杂度增加(调用链路追踪困难) - 性能损耗(长链导致延迟) #### 六、与其他模式的关系 - **组合模式**:可组合使用实现树形处理结构 - **命令模式**:可将请求封装为命令对象传递 - **装饰模式**:都使用链式结构,但目的不同(装饰模式侧重功能叠加) §§ 相关问题 §§ 1. 如何处理责任链中的循环引用问题? 2. 责任链模式与状态模式的区别是什么? 3. 如何实现异步责任链? 4. 哪些开源框架使用了责任链模式? 5. 责任链模式在微服务架构中的应用?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值