设计模式之 责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,旨在将多个处理对象通过链式结构连接起来,形成一条处理请求的链条。每个处理对象都有机会处理请求,或者将请求传递给链中的下一个对象。这样,客户端不需要知道哪个具体的对象会处理请求,而是通过责任链的结构来自动地传递和处理请求。

责任链模式的核心思想是将处理请求的职责链式连接起来,由链中的对象依次处理请求,直到某个对象处理完请求为止。

一、责任链模式的组成部分

责任链模式通常包含以下几个角色:

  1. Handler(处理者接口):

    定义了一个接口,声明了处理请求的方法。在该方法中,处理者通常会选择是否处理请求。如果能够处理,则处理请求,否则将请求转发给下一个处理者。

  2. ConcreteHandler(具体处理者):

    实现了Handler接口,定义了具体的处理逻辑。如果该对象能够处理请求,则直接处理;如果不能处理,则将请求传递给下一个处理者。

  3. Client(客户端):

    负责初始化责任链,并向链中的第一个处理者发送请求。客户端不需要关心请求是由哪一个处理者来完成的。

  4. Chain(责任链):

    由多个处理者对象组成。每个处理者对象都有一个指向下一个处理者的引用。请求会沿着责任链逐一传递,直到有处理者处理请求或者链的末尾。

二、责任链模式的工作原理

责任链模式的工作原理是将多个处理对象组成链条,每个处理对象知道下一个处理对象,并负责将请求转发给下一个对象。每个处理者对象会判断自己是否能够处理请求,如果可以处理请求,则执行相应的操作;如果不可以处理请求,则将请求转发给责任链中的下一个处理者。

这种设计模式非常适合处理多个处理条件之间的连贯流程,例如:请求审批流程、日志记录、事件处理等。

三、责任链模式的代码示例
定义抽象处理者
java 复制代码
public abstract class Handler{

    protected Handler nextHandler;

    public abstract void setNext(Handler handler);

    public abstract void handleRequest(int request);
}
定义具体的处理者
java 复制代码
public class GroupHandler extends Handler{

    @Override
    public void setNext(Handler handler) {
        nextHandler = handler;
    }


    @Override
    public void handleRequest(int request) {
        if (request < 3){
            System.out.println("小组长批准"+request+"天假");
        }else {
            nextHandler.handleRequest(request);
        }
    }
}
java 复制代码
public class Manager extends Handler{

    @Override
    public void setNext(Handler handler) {
        nextHandler = handler;
    }

    @Override
    public void handleRequest(int request) {
        if (request < 5){
            System.out.println("经理批准"+request+"天假");
        }else {
            nextHandler.handleRequest(request);
        }
    }
}
java 复制代码
public class GeneralManager extends Handler{

    @Override
    public void setNext(Handler handler) {
        throw new RuntimeException("总经理是最高职位");
    }

    @Override
    public void handleRequest(int request) {
        if (request < 10){
            System.out.println("总经理批准"+request+"天假");
        }
    }
}
客户端代码
java 复制代码
public class Client {
    public static void main(String[] args) {
        GroupHandler groupHandler = new GroupHandler();
        Manager manager = new Manager();
        GeneralManager generalManager = new GeneralManager();
        groupHandler.setNext(manager);
        manager.setNext(generalManager);
        //请四天假
        groupHandler.handleRequest(4);
    }
}
运行结果
四、责任链模式的优缺点
优点:
  1. 解耦请求发送者与处理者:客户端不需要知道哪个处理者会处理请求,只需要发起请求即可,责任链的结构内部决定了请求的处理流程。
  2. 降低了对象之间的耦合度:每个处理者仅仅负责判断请求是否能处理,并将无法处理的请求传递给下一个处理者。这样,系统中的对象之间的依赖关系大大减少。
  3. 增强灵活性和扩展性:责任链中的每个处理者都可以独立扩展,可以通过增加新的处理者来修改或扩展请求处理的逻辑,而不需要修改现有的代码。
  4. 动态控制请求的处理流程:请求的处理可以动态改变,可以控制责任链的顺序,或者在运行时选择是否将请求传递给下一个处理者。
缺点:
  1. 性能开销:如果责任链较长,且每个请求都需要经过多个处理者,可能会导致性能问题,因为每个请求都需要被逐个检查和转发。
  2. 调试难度:由于请求可能会经过多个处理者,这种链式的调用可能会增加调试的难度,尤其是在请求的处理过程非常复杂时,调试和跟踪问题可能会变得更加困难。
  3. 请求处理不明确:如果没有明确的设计,责任链中的某个请求可能会一直传递下去,直到链的最后也没有处理,从而可能导致请求的处理不及时,或者被忽略。
五、责任链模式的应用场景

责任链模式适用于以下几种场景:

  1. 多层次的请求处理:

    当有多个处理对象需要依次处理同一个请求时,责任链模式非常适用。例如,权限验证、审批流程等需要经过多个步骤的处理。

  2. 动态改变请求的处理顺序:

    通过灵活配置责任链,可以动态改变请求的处理顺序,而无需修改客户端的代码。例如,在一些复杂的系统中,根据不同的配置,可能会根据不同的规则选择不同的处理链。

  3. 日志处理系统:

    责任链模式非常适合用于日志系统,不同的日志处理器(如文件日志、数据库日志、网络日志等)可以按顺序处理日志请求。如果一个处理器无法处理日志,可以将其传递给下一个处理器。

  4. 事件处理系统:

    在事件驱动的系统中,可以使用责任链模式来分发和处理事件。事件可以依次传递给多个处理者,每个处理者可以根据自己的条件决定是否处理该事件。

  5. 权限验证:

    • 在系统中的权限控制过程中,可能会有多个权限验证步骤,责任链模式可以通过设置多个权限验证处理者来实现逐步验证,直到请求满足某个权限要求。
相关推荐
海绵宝宝转agent2 小时前
learn-claude-code第1-5章开源学习笔记分享
人工智能·笔记·python·学习
小奇不哭2 小时前
ROS2 单节点,RGB-D 深度相机局部路径提取 + B 样条平滑路径 + YOLOv8 障碍物检测 + 深度测距,用于移动机器人视觉局部循迹。
python·yolov8·ros2·cv2·路径探索循迹
小小龙学IT3 小时前
Python scikit-learn 机器学习库深度解析
python·机器学习·scikit-learn
2601_962071573 小时前
类变量和全局变量的查找路径有什么区别?
开发语言·python
卷无止境4 小时前
独立开发者的"富矿地带":哪些垂直领域值得你押注一辈子?
后端·python
Java后端的Ai之路4 小时前
Python进阶探索29_eval内置函数
开发语言·python·探索·eval·内置函数
计算机毕业编程指导师4 小时前
计算机毕设选题推荐:基于Hadoop与Spark的Steam游戏数据分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·计算机·spark·毕业设计·steam游戏
计算机毕业编程指导师4 小时前
【计算机毕设选题推荐】基于Hadoop+Spark的白鹿抖音评论大数据分析与可视化系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·计算机·spark·毕业设计·抖音评论
Zootopia6265 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
Y3815326625 小时前
搜索 API 延迟优化:并发数、超时与超时的真实代价
python·搜索引擎