Java设计模式—责任链模式(Chin of Responsibility)

news2024/9/20 18:47:13

目录

前言

一、责任链模式的简介

二、责任链模式的概念

三、责任链模式的作用

四、责任链模式的优、缺点

1.责任链模式的优点

2.责任链模式的缺点

五、责任链模式的应用场景

六、代码案例

UML类图

 1.定义一个请求枚举类

 2.定义一个请求类

3.定义一个抽象处理接口

4、定义具体处理类

5.Main代码测试

总结


前言

使用责任链模式,它可以动态地添加或删除处理器,从而改变处理请求的顺序和方式。同时,责任链模式也可以减少对象之间的耦合度,提高代码的可扩展性和可维护性。


一、责任链模式的简介

责任链模式(Chin of Responsibility)是一种行为型设计模式,它通过将请求的发送者和接收者解耦来实现请求的处理。


二、责任链模式的概念

责任链模式(Chin of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链子,并沿着这条链传递该请求,直到有一对象处理到它为止。


三、责任链模式的作用

责任链模式(Chin of Responsibility)的作用是将请求的发送者和接收者解耦,使多个对象都有机会处理该请求。它将这些对象连接成一条链,并沿着链传递请求,直到有一个对象处理它为止。

责任链模式的主要作用包括以下:

  1. 降低系统的耦合度
  2. 增强系统的灵活性
  3. 提高代码的可扩展性
  4. 提高代码的可维护性

四、责任链模式的优、缺点

1.责任链模式的优点

  1. 降低系统的耦合度:请求发送者和接收者之间不直接交互,而是通过责任链上的多个对象进行交互,从而降低了它们之间的耦合度。
  2. 增强系统的灵活性:可以动态地增加或删除处理器,从而改变请求的处理顺序和方式。
  3. 提高代码的可扩展性:因为每个处理器都只负责处理自己能够处理的请求,所以可以方便地添加新的处理器来处理新的请求类型。
  4. 提高代码的可维护性:因为每个处理器都只负责处理自己能够处理的请求,所以可以方便地添加新的处理器来处理新的请求类型。

2.责任链模式的缺点

  1. 请求可能没有被处理:如果没有任何一个处理器能够处理该请求,则该请求将被忽略。
  2. 系统性能可能受影响:由于责任链中可能包含大量的处理器,因此可能会影响系统的性能。

五、责任链模式的应用场景

责任链的使用场景有以下几点:

  1. 处理请求需要多个对象协作,且不确定哪个对象能够处理请求。
  2. 需要动态指定能够处理请求的对象集合。
  3. 需要在不明确接收者的情况下,向多个对象中的一个或多个发送请求。
  4. 可以通过在运行时添加或删除处理器来改变请求处理的顺序。
  5. 当一个请求需要被多个对象进行处理时,可以使用责任链模式避免产生复杂的嵌套调用。
  6. 可以将责任链模式与其他设计模式结合使用,如装饰器模式、工厂模式等,以实现更加灵活的功能。

六、代码案例

UML类图

 1.定义一个请求枚举类

RequestType请求枚举

/***
 * 定义请求枚举
 */
public enum RequestType {
    TYPE_A, TYPE_B, TYPE_C
}

 2.定义一个请求类

Request请求类

/***
 * 定义请求类
 */
public class Request {
    private String name;
    private RequestType type;

    public Request(String name, RequestType type) {
        this.name = name;
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public RequestType getType() {
        return type;
    }
}

3.定义一个抽象处理接口

定义一个抽象处理器(Handler)类,其中包含一个指向下一个处理器的引用,并定义一个处理请求的方法。

Handler抽象类

/***
 * 定义一个抽象处理器(Handler)类,其中包含一个指向下一个处理器的引用,并定义一个处理请求的方法。
 */
public abstract class Handler {
    protected Handler successor;

    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }

    public abstract void handleRequest(Request request);
}

4、定义具体处理类

ConcreteHandlerA类

/***
 * 定义具体处理类
 */
public class ConcreteHandlerA extends Handler {

    @Override
    public void handleRequest(Request request) {
        if (request.getType().equals(RequestType.TYPE_A)) {
            System.out.println("ConcreteHandlerA处理请求" +request.getName());
        } else if (successor != null) {
            successor.handleRequest(request);
        }
    }
}

ConcreteHandlerB类

/***
 * 定义具体处理类
 */
public class ConcreteHandlerB extends Handler {

    @Override
    public void handleRequest(Request request) {
        if (request.getType().equals(RequestType.TYPE_B)) {
            System.out.println("ConcreteHandlerB处理请求" + request.getName());
        } else if (successor != null) {
            successor.handleRequest(request);
        }
    }

ConcreteHandlerC类

/***
 * 定义具体处理类
 */
public class ConcreteHandlerC extends Handler {

    @Override
    public void handleRequest(Request request) {
        if (request.getType().equals(RequestType.TYPE_C)) {
            System.out.println("ConcreteHandlerC处理请求" + request.getName());
        } else if (successor != null) {
            successor.handleRequest(request);
        }
    }
}

5.Main代码测试

 public static void main(String[] args) {
        Handler handlerA = new ConcreteHandlerA();
        Handler handlerB = new ConcreteHandlerB();
        Handler handlerC = new ConcreteHandlerC();

        handlerA.setSuccessor(handlerB);
        handlerB.setSuccessor(handlerC);

        Request request1 = new Request("已处理 1", RequestType.TYPE_A);
        Request request2 = new Request("已处理 2", RequestType.TYPE_B);
        Request request3 = new Request("已处理 3", RequestType.TYPE_C);

        handlerA.handleRequest(request1);
        handlerA.handleRequest(request2);
        handlerA.handleRequest(request3);
    }

输出结果:

 


总结

这个示例中,具体处理器类实现了抽象处理器接口,并根据自己的能力来判断是否能够处理请求。如果不能处理,则将请求传递给下一个处理器。客户端创建责任链并将请求发送给第一个处理器,处理器依次处理请求,直到有一个处理器能够处理它为止。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/638872.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TS中any与unknown详解,示例

文章目录 前言一、一个示例二、示例目的1、功能描述2、主要区别3、代码实现 总结 前言 本片文章主要是在写ts时遇到不知道类型,很容易就想到用any可以解决一切,但这样写并不好。所以今天就总结学习一下,比较好的处理任意类型的unknown。 一、…

2023年最新网络安全入门指南,保姆级教程!啃完这篇就够了

一、网络安全学习的误区 1.不要试图以编程为基础去学习网络安全 不要以编程为基础再开始学习网络安全,一般来说,学习编程不但学习周期长,且过渡到网络安全用到编程的用到的编程的关键点不多。一般人如果想要把编程学好再开始学习网络安全往…

大气污染扩散模型Calpuff教程

详情点击链接:大气污染扩散模型Calpuff教程一,Calpuff 1.Calpuff模型 2、Calpuff模型基础 3、Calpuff模型下载安装 1)Calpro系统安装 2)安装环境要求 3)需安装的辅助软件二,数据预处理 1.网格设置 …

Vue3-04-生命周期

Vue 的生命周期描述组件从创建到销毁的全过程。Vue3 和 Vue2 的生命周期钩子非常像,我们仍然可以在相同的场景下使用相同的钩子函数。 Vue3 在设计时对先前的版本进行了向下兼容,如果你的项目还在使用选项式 API 进行构建,那么不需要修改生命…

【stable diffusion】图片批量自动打标签、标签批量修改(BLIP、wd14)用于训练SD或者LORA模型

参考: B站教学视频【:AI绘画】新手向!Lora训练!训练集准备、tag心得、批量编辑、正则化准备】官方教程:https://github.com/darkstorm2150/sd-scripts/blob/main/docs/train_README-en.md#automatic-captioning 一、…

Springboot全文链路id,并ELK搭建部署整合全文链路id

Springboot全文链路id,并ELK搭建部署整合全文链路id 1.docker-compose.yaml部署 version: 3 services:elasticsearch:image: elasticsearch:7.13.2container_name: elasticsearchenvironment:- "cluster.nameelasticsearch" #设置集群名称为elasticsearch- "d…

[笔记]C++并发编程实战 《五》C++内存模型和原子类型操作

文章目录 前言第5章 C内存模型和原子类型操作5.1 内存模型基础5.1.1 对象和内存位置5.1.2 对象、内存位置和并发5.1.3 修改顺序 5.2 C中的原子操作和原子类型5.2.1 标准原子类型 总结 前言 第5章 C内存模型和原子类型操作 本章主要内容: C11内存模型详解标准库提…

【Docker】子系统与其相关名词的界定、Control Groups等详细讲解

前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 📕作者简介:热…

回收旧物系统平台开发的功能

1、定位服务 为了方便用户寻找最近的废品回收点,小程序应该提供位置服务和导航功能。 2、垃圾分类知识普及 用户可以查看所有垃圾分类知识,每种物品属于哪一个类型的垃圾分类。一目了然。相当于一本活字典,用户可以随时翻看查阅垃圾分类的…

人工智能(pytorch)搭建模型11-pytorch搭建DCGAN模型,一种生成对抗网络GAN的变体实际应用

大家好,我是微学AI,今天给大家介绍一下人工智能(pytorch)搭建模型11-pytorch搭建DCGAN模型,一种生成对抗网络GAN的变体实际应用,本文将具体介绍DCGAN模型的原理,并使用PyTorch搭建一个简单的DCGAN模型。我们将提供模型…

java+openlayer实现大气污染扩散模拟反演

一、模拟参数及效果 二、应用背景 大气污染是当今社会面临的一个重要问题。随着工业化和城市化的进程,大气污染问题变得越来越严重。为了更好地应对这个问题,许多科学家和研究人员开始探索大气污染扩散反演技术。 大气污染扩散反演技术是一种通过数学模…

给软件测试人的一封信,全网最佳“指路明灯“

一、一招鲜吃遍天下 你需要有一个核心技能。这个技能至少达到远超你的同事(包括开发岗位的同事的)平均水平。最好达到业界领先水平,且这个核心技能需要不断打磨提高。比如,我选择的核心技能是使用Python写代码。这个核心技能可以…

3.2 基于Java配置类整合SSM框架实现用户登录

一、基于Java配置类整合SSM框架实现用户登录 1、创建Maven项目 Maven项目 - SSMLoginNew 单击【Finish】按钮 2、添加相关依赖 在pom.xml文件里添加相关依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache…

Kubernetes 1.27 加快 Pod 启动速度

如何在大型集群中加快节点上的 Pod 启动&#xff1f;这是企业集群管理员常常会面临的问题。 这篇博文重点介绍了从 kubelet 一侧加快 Pod 启动的方法。此方法不涉及通过 kube-apiserver 由 controller-manager 创建 Pod 所用的时间段&#xff0c;也不包含 Pod 的调度时间或在其…

电脑最牛逼的截图方式

1.电脑桌面上空白的地方新建一个文本文档&#xff0c;将后缀名修改为bat&#xff0c;截图如下&#xff1a; 2.右键点击该文档编辑&#xff0c;在编辑界面输入start snippingtool&#xff0c;点击保存之后关闭该文档。 3.双击该文档&#xff0c;在模式里面选择响应的截图方式即可…

MySQL IDE与pymysql模块

一、IDE工具介绍 生产环境还是推荐使用mysql命令行&#xff0c;但为了方便我们测试&#xff0c;可以使用IDE工具 在此我们推荐使用Navicat软件或pycharm来连接数据库,这样就能更详细直观地查询数据 掌握&#xff1a; #1. 测试链接数据库 #2. 新建库 #3. 新建表&#xff0c;新增…

2023 年程序员高考试卷!你能答对几个?

又是一年高考季&#xff0c;一起来做做“程序员们的高考试卷”&#xff0c;压压惊吧~ 2023年普通高等学校招生全国统一考试 程序员的高考试卷&#xff08;A卷&#xff09; 考生类别&#xff1a;码农 1、程序员A&#xff1a;借我1000元吧。 程序员B&#xff1a;给你凑个整数…

Linux基础知识点2

Linux基础知识 适合有Linux基础的人群进行复习。 禁止转载&#xff01; 文件管理与常用命令 Linux的文件的组成部分&#xff1a; 文件名、inode(i节点)和block(真正存数据的区域)。 查看某个文件的属性&#xff1a; ls -lh #可看到有类似”-rw-r--r--”的属性符号 …

轻松来自实力,亚马逊云科技助力边界智能应对业务高峰值数据考验

边界智能&#xff08;Bianjie.AI&#xff09;是2016年创立于上海的国家高新技术企业和专精特新企业&#xff0c;同时也是以香港为全球总部、服务全球的区块链技术创新团队。公司专注于区块链技术支持的下一代互联网应用服务&#xff0c;自主研发了跨多条联盟链的分布式应用服务…

STL入门 + 刷题(下)

&#x1f442; Raindrops (Intl. Version) - Katja Krasavice/Leony - 单曲 - 网易云音乐 &#x1f442; Rush E (Playable Version) - Sheet Music Boss - 单曲 - 网易云音乐 &#x1f442; 最美的瞬间 - 真瑞 - 单曲 - 网易云音乐 &#x1f442; 你可别卷了 - SipSu小口酥…