• 设计模式:责任链模式


    责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象按照顺序处理请求,直到其中一个对象能够处理该请求为止。责任链模式将请求发送者和接收者解耦,使得多个对象都有机会处理请求,同时避免了请求发送者与接收者之间的直接耦合关系。

    在责任链模式中,请求被沿着一个链传递,每个对象都有机会处理请求或将其传递给链中的下一个对象。每个对象在收到请求后,可以选择处理请求或将其传递给下一个对象。这样,请求会依次经过链中的对象,直到有一个对象能够处理它为止。

    组件

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

    1. 抽象处理者(Handler):定义了处理请求的接口,通常包含一个指向下一个处理者的引用。
    2. 具体处理者(Concrete Handler):实现了处理请求的方法,如果自己无法处理请求,则将其传递给下一个处理者。

    代码示例

    abstract class Handler {
        private Handler nextHandler;
         public void setNextHandler(Handler nextHandler) {
            this.nextHandler = nextHandler;
        }
         public void handleRequest(int request) {
            if (canHandle(request)) {
                processRequest(request);
            } else if (nextHandler != null) {
                nextHandler.handleRequest(request);
            }
        }
         protected abstract boolean canHandle(int request);
         protected abstract void processRequest(int request);
    }
    // 具体处理者A
    class ConcreteHandlerA extends Handler {
        protected boolean canHandle(int request) {
            return request >= 0 && request < 10;
        }
         protected void processRequest(int request) {
            System.out.println("ConcreteHandlerA 处理请求:" + request);
        }
    }
    // 具体处理者B
    class ConcreteHandlerB extends Handler {
        protected boolean canHandle(int request) {
            return request >= 10 && request < 20;
        }
         protected void processRequest(int request) {
            System.out.println("ConcreteHandlerB 处理请求:" + request);
        }
    }
    // 具体处理者C
    class ConcreteHandlerC extends Handler {
        protected boolean canHandle(int request) {
            return request >= 20 && request < 30;
        }
         protected void processRequest(int request) {
            System.out.println("ConcreteHandlerC 处理请求:" + request);
        }
    }
    // 客户端代码
    public class Main {
        public static void main(String[] args) {
            // 创建责任链
            Handler handlerA = new ConcreteHandlerA();
            Handler handlerB = new ConcreteHandlerB();
            Handler handlerC = new ConcreteHandlerC();
            handlerA.setNextHandler(handlerB);
            handlerB.setNextHandler(handlerC);
             // 发送请求
            handlerA.handleRequest(5);
            handlerA.handleRequest(15);
            handlerA.handleRequest(25);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    在上述示例中,我们定义了抽象处理者(Handler)和具体处理者(ConcreteHandlerA、ConcreteHandlerB、ConcreteHandlerC)。每个处理者都有一个指向下一个处理者的引用,通过 setNextHandler() 方法进行设置。

    客户端代码中,我们创建了一个责任链,并将请求发送给第一个处理者(handlerA)。每个处理者根据自己的条件判断是否能处理请求,如果可以处理,则进行处理;否则将请求传递给下一个处理者。

    这个示例展示了如何使用Java实现责任链模式,通过责任链的方式依次处理请求,直到找到能够处理请求的处理者为止。

    源码中使用

    责任链模式在源码中有很多应用。以下是一些常见的源码中使用责任链模式的情况:

    1. Java中的异常处理机制:Java中的异常处理机制就是一种责任链模式的应用。当一个异常被抛出时,会从当前方法开始向上查找匹配的异常处理器,直到找到能够处理该异常的处理器为止。
    2. Servlet中的过滤器(Filter):Servlet中的过滤器也使用了责任链模式。多个过滤器按照一定的顺序形成一个责任链,每个过滤器可以对请求进行处理或者传递给下一个过滤器进行处理。
    3. Spring框架中的拦截器(Interceptor):Spring框架的拦截器也是一种责任链模式的应用。拦截器可以在请求处理前后进行一些额外的操作,如权限验证、日志记录等。
    4. Android中的事件分发机制:Android中的事件分发机制也使用了责任链模式。事件从顶层View开始向下传递,每个View可以对事件进行处理或者传递给下一个View进行处理。
      这些是责任链模式在源码中的一些常见应用。责任链模式通过形成一个责任链,将请求的处理逻辑拆分成多个处理者,每个处理者负责处理或传递请求。这样可以实现解耦和灵活的处理逻辑。

    优缺点

    优点:

    1. 解耦请求发送者和接收者:责任链模式将请求的发送者和接收者解耦,发送者无需知道具体的接收者,只需要将请求发送给责任链的第一个处理者即可。
    2. 可扩展性和灵活性:责任链模式可以动态地添加、修改或删除处理者,灵活地调整责任链的结构和顺序,以满足不同的需求。
    3. 可以对请求进行过滤和处理:责任链模式允许每个处理者对请求进行过滤和处理,可以根据不同的条件选择是否处理请求,以及如何处理请求。
    4. 可以降低耦合度:责任链模式将请求的发送者和接收者解耦,减少了它们之间的直接依赖关系,从而降低了耦合度。
      缺点:
    5. 请求可能未被处理:责任链模式没有保证请求一定会被处理,如果责任链没有正确配置或者没有处理者能够处理该请求,请求可能会被忽略。
    6. 可能存在性能问题:当责任链较长时,请求需要依次经过每个处理者,可能会导致性能下降。同时,过多的处理者也会增加系统的复杂性。
    7. 可能导致调试困难:由于请求的处理者是动态变化的,当出现问题时,可能需要跟踪整个责任链来定位问题,增加了调试的难度。

    总结

    责任链模式通过将请求的发送者和接收者解耦,提供了一种灵活和可扩展的处理机制。它可以对请求进行过滤和处理,降低耦合度。然而,责任链模式也可能导致请求未被处理、性能问题以及调试困难。在使用责任链模式时,需要根据具体情况权衡其优缺点,确保合理使用。

  • 相关阅读:
    Redis<一>-redis简介与安装
    uniapp应用内苹果支付怎么写?
    opengles 绘制图元 ——glDrawArrays() 相关API介绍 (十)
    【Web前端二级导航栏】
    java计算机毕业设计ssm陕理工图书馆管理系统
    企业无线架构——旁挂式组网
    从C语言基础到高级C语言 (结构体和位域)
    【Adobe Illustrator 教程】4. 认识渐变工具
    Blender生成COLMAP数据集
    输入部件 QComboBox --组合框/下拉列表
  • 原文地址:https://blog.csdn.net/qq_27586963/article/details/132945696