责任链模式

news/2024/5/19 13:45:00 标签: 责任链模式, java

介绍

责任链模式是一种行为型设计模式,其目的是将请求从一个对象传递到另一个对象,直到找到能够处理该请求的对象为止.再责任链模式中,每个对象都持有对下一个对象的引用,形成一个链条.当一个请求进入这个链条时,每个对象一次判断是否有能力处理该请求,如果有,就处理该请求,如果没有就将请求传递给下一个对象.这样,直到找到能够处理该请求的对象为止,或者请求无法被任何对象处理时,责任链模式才结束.

实现

请求类型枚举

java">public enum RequestType {
    TYPE_A,
    TYPE_B
}

请求类

java">@Data
public class Request {

    private RequestType requestType;

    private String content;

    public Request(RequestType requestType, String content) {
        this.requestType = requestType;
        this.content = content;
    }
}

抽象处理类

java">@Data
public abstract class Handler {

    protected Handler nextHandler;

    /**
     * 处理请求的方法
     *
     * @param request
     */
    public abstract void handle(Request request);
}

具体处理类

java">public class ConcreteHandlerA extends Handler {

    /**
     * 处理请求的方法
     *
     * @param request
     */
    @Override
    public void handle(Request request) {
        if (request.getRequestType() == RequestType.TYPE_A) {
            // 处理请求
            System.out.println("ConcreteHandlerA 处理了请求:" + request.getContent());
        }else {
            // 将请求传递给下一个处理器
            if (nextHandler != null){
                nextHandler.handle(request);
            }
        }
    }
}

public class ConcreteHandlerB extends Handler{

    /**
     * 处理请求的方法
     *
     * @param request
     */
    @Override
    public void handle(Request request) {
        if (request.getRequestType() == RequestType.TYPE_B) {
            // 处理请求
            System.out.println("ConcreteHandlerB 处理了请求:" + request.getContent());
        }else {
            // 将请求传递给下一个处理器
            if (nextHandler != null){
                nextHandler.handle(request);
            }
        }
    }
}	

测试

java">public class Demo {

    public static void main(String[] args) {
        // 创建责任链
        Handler handlerA = new ConcreteHandlerA();
        Handler handlerB = new ConcreteHandlerB();
        handlerA.setNextHandler(handlerB);

        // 发送请求
        Request request1 = new Request(RequestType.TYPE_A,"请求A");
        handlerA.handle(request1);

        Request request2 = new Request(RequestType.TYPE_B,"请求B");
        handlerA.handle(request2);

        Request request3 = new Request(RequestType.TYPE_A,"请求C");
        handlerA.handle(request3);
    }
}

在这里插入图片描述

我们可以看到,请求A被ConcreteHandlerA处理了,请求B被ConcreteHandlerB处理,请求C又被ConcreteHandlerA处理.这是因为我们将ConcreteHandlerA和ConcreteHandlerB连接成了一个责任链,请求会依次被传递给每个处理器,直到有一个处理器能够处理它为止.如果没有任何处理器能够处理请求,请求将被忽略.

总结

优点

  • 解耦性强:责任链模式能够将请求者和处理者解耦,请求者无需知道请求的处理者是谁,处理者也无需知道请求的发送者是谁,从而降低了系统的耦合度
  • 可扩展性强:责任链模式可以动态地增加,修改,删除请求的处理者,系统的灵活性和可扩展性得到了增强
  • 代码可读性高:责任链模式能够将请求处理流程分解为多个小的处理单元,可以避免复杂的if-else嵌套,使得代码更加清晰易读.

缺点:

  • 可能会造成性能问题:当责任链中的处理者过多或处理的任务比较耗时时,可能会造成性能问题.
  • 请求处理不一定会被处理:如果没有处理者处理某个请求,那么该请求就会别丢弃,无法得到处理,可能会导致系统异常或出错.

应用场景

  • 请求需要被多个对象处理:当一个请求需要被多个对象处理时,可以使用责任链模式.例如:一个事件发生后需要经过多个对象处理,这些对象可以组成责任链,按顺序处理该事件.
  • 请求需要按顺序被处理:当一个请求需要按照一定的顺序被处理时,可以使用责任链模式.例如:多个对象需要按照某个顺序依次处理请求,这些对象可以组成责任链,按顺序处理请求.
  • 动态添加请求处理者:当需要动态添加,删除或修改请求处理者时,可以使用责任链模式.例如:需要动态地修改请求处理流程,可以通过修改责任链中的处理者来实现.
  • 需要避免请求发送者和接收者之间的耦合关系:当需要避免请求发送者和接收者之间的耦合关系时,可以使用责任链模式.例如:需要将请求发送者和接收者解耦,使得系统更加灵活,可扩展.

http://www.niftyadmin.cn/n/149349.html

相关文章

【计算机网络-自顶向下】一篇就够了——学习笔记超详细整理

⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 更多学习笔记链接👉https://github.com/A-BigTree/college_assignment 如果可以,麻烦各位看官顺手点个star~😊 如果文章对你有所帮助,可以点赞👍…

谁青睐X86?游戏上车「变革」

哪种芯片,才是未来座舱从智能化到娱乐化的主力军? 过去几年,随着高通系列平台成为汽车制造商的首选,基于Arm架构的SoC凭借低功耗、与安卓系统(大部分座舱主机的首选操作系统)的无缝衔接(包括背后…

PyTorch深度学习实战 | 计算机视觉

深度学习领域技术的飞速发展,给人们的生活带来了很大改变。例如,智能语音助手能够与人类无障碍地沟通,甚至在视频通话时可以提供实时翻译;将手机摄像头聚焦在某个物体上,该物体的相关信息就会被迅速地反馈给使用者&…

2023-03-14 mysql-innodb-事务实现-思考

摘要: 事务是数据库的一个很重要的点, 无论如何都绕不开, 尤其是对于TP系统来说没有事务是不可想象的。 本文对innodb的事务的实现进行一些反思 事务的特性: A 原子性C 一致性I 隔离性D 持久性innodb的事务实现 原子性: 依赖于undo logundo log中不仅仅记录了如果回滚的操作…

OpenCV实战(13)——高通滤波器及其应用

OpenCV实战(13)——高通滤波器以及应用0. 前言1. 检测图像边缘1.2 Sobel 滤波器1.2 梯度算子1.3 高斯导数2. 图像拉普拉斯算子2.1 拉普拉斯算子2.2 使用拉普拉斯算子增强图像的对比度2.3 高斯差3. 完整代码小结系列链接0. 前言 在频域分析中&#xff0c…

怎么将手机图片转成Word文档?办公常备软件

在工作中,我们经常需要使用手机拍摄照片来记录或传达信息。有时候我们需要将这些照片转化为Word文档,这就需要一些专业的工具和技巧。在这里,将介绍如何将手机图片转化为Word文档。我会提供多种方法,包括使用在线转换工具、使用转…

快速入门深度学习4.1(用时1h)——多层感知器

速通《动手学深度学习》4.1写在最前面3.线性神经网络3.74.多层感知器4.1.1 隐藏层4.1.1.2 在网络中加入隐藏层4.1.1.3 从线性到非线性(激活函数)4.1.2. 激活函数4.1.2.1. ReLU函数4.1.2.2. sigmoid函数4.1.2.3. tanh函数4.1.3. 小结4.2 多层感知机的从零…

CleanMyMac X4.20免费mac电脑系统优化工具

相信不少的小伙伴都在用mac电脑,不论是 iMac,还是 MacBok,用着用着电脑就变慢了。这通病与苹果电脑的性能无关,主要是硬盘空间不足的问题!当然你可以把硬盘升级,但主要的问题是没有钱! CleanMy…