【软考】设计模式之责任链模式

目录

          • 1. 说明
          • 2. 应用场景
          • 3. 结构图
          • 4. 构成
          • 5. 适用性
          • 6. 优点
          • 7. 缺点
          • 8. java示例

1. 说明
  • 1.使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
  • 2.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
  • 3.责任链模式(Chain of Responsibility Pattern)是一种行为设计模式。
  • 4.它为请求的发送者和接收者之间解耦提供了一种相对松散的耦合方式,使得多个对象都有机会处理这个请求,或者将这个请求传递给链中的下一个对象。
  • 5.这种模式将多个处理者对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
  • 6.这种模式给予请求传递的灵活性,并且使得对象不需要知道链的结构。
2. 应用场景
  • 1.多个对象可以处理一个请求,但具体由哪个对象处理在运行时决定。
  • 2.在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
  • 3.可动态指定一组对象处理请求。
3. 结构图

在这里插入图片描述

4. 构成
  • 1.抽象处理者(Handler):定义一个处理请求的接口,通常包含一个或多个指向下一个处理者的引用(即链中的下一个节点)和一个处理请求的接口方法。(可选)实现后继链。
  • 2.具体处理者(Concrete Handler):实现了抽象处理者角色定义的接口,主要负责处理它负责的请求,或者将请求转发给链中的下一个处理者,以及可以访问链中下一个处理者的引用。处理它所负责的请求;可访问它的后继者;如果可处理该请求,就处理它,否则将该请求转发给后继者。
  • 3.客户端(Client):创建处理链,并向链中的第一个处理者对象提交请求。向链上的具体处理者(ConcreteHandler)对象提交请求。
5. 适用性
  • 1.有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
  • 2.想在不明确指定接收者的情况下向多个对象中的一个提交一个请求。
  • 3.可处理一个请求的对象集合应被动态指定。
6. 优点
  • 1.降低耦合度:将请求的发送者和接收者解耦。
  • 2.简化对象:使得对象不需要知道链的结构。
  • 3.增强给请求分配职责的灵活性:通过改变链内的成员或调动它们的次序,允许动态地新增或者删除处理者。
  • 4.增加新的处理类很容易:无须修改现有代码,符合开闭原则。
7. 缺点
  • 1.不能保证请求一定被处理:如果没有处理者处理该请求,请求就会一直传递下去,直到链的末尾。
  • 2.系统性能会受到一定影响:因为请求在链中传递,每个处理者都需要对请求进行判断,增加了系统响应时间。
  • 3.调试复杂:链中处理者众多,增加了系统复杂性,可能难以追踪和调试。
8. java示例
  • 1.日志处理器接口
package com.learning.responsibility.example;// 日志处理器接口
public interface Logger {  void log(LogMessage message);  void setNextLogger(Logger nextLogger);  
} 
  • 2.日志级别枚举
package com.learning.responsibility.example;// 日志级别枚举
public enum LogLevel {  INFO, DEBUG, ERROR  
} 
  • 3.日志消息类
package com.learning.responsibility.example;// 日志消息类
public class LogMessage {  private LogLevel level;  private String message;  public LogMessage(LogLevel level, String message) {  this.level = level;  this.message = message;  }  public LogLevel getLevel() {  return level;  }  public String getMessage() {  return message;  }  
}
  • 4.抽象日志处理器类
package com.learning.responsibility.example;// 抽象日志处理器类
public abstract class AbstractLogger implements Logger {  protected int level;  protected Logger nextLogger;  @Overridepublic void setNextLogger(Logger nextLogger) {this.nextLogger = nextLogger;  }  protected void writeToLog(String message) {  System.out.println("日志级别:" + level + ", 日志内容:" + message);}  @Override  public void log(LogMessage message) {  if (this.level <= message.getLevel().ordinal()) {  write(message);  }  if (nextLogger != null) {  nextLogger.log(message);  }  }  abstract protected void write(LogMessage message);  
}
  • 5.INFO日志处理器
package com.learning.responsibility.example;// INFO日志处理器
public class InfoLogger extends AbstractLogger {  public InfoLogger(int level) {  this.level = level;  }  @Override  protected void write(LogMessage message) {  if (message.getLevel() == LogLevel.INFO) {  writeToLog(message.getMessage());  }  }  
} 
  • 6.DEBUG日志处理器
package com.learning.responsibility.example;// DEBUG日志处理器
public class DebugLogger extends AbstractLogger {  public DebugLogger(int level) {  this.level = level;  }  @Override  protected void write(LogMessage message) {  if (message.getLevel() == LogLevel.DEBUG) {  writeToLog(message.getMessage());  }  }  
}  
  • 7.ERROR日志处理器
package com.learning.responsibility.example;// ERROR日志处理器
public class ErrorLogger extends AbstractLogger {  public ErrorLogger(int level) {  this.level = level;  }  @Override  protected void write(LogMessage message) {  if (message.getLevel() == LogLevel.ERROR) {  writeToLog(message.getMessage());  }  }  
}
  • 8.应用类
package com.learning.responsibility.example;public class Client {public static void main(String[] args) {Logger loggerChain = null; // 创建日志处理器链Logger infoLogger = new InfoLogger(LogLevel.INFO.ordinal());Logger debugLogger = new DebugLogger(LogLevel.DEBUG.ordinal());Logger errorLogger = new ErrorLogger(LogLevel.ERROR.ordinal());// 设置链infoLogger.setNextLogger(debugLogger);debugLogger.setNextLogger(errorLogger);loggerChain = infoLogger;// 发送日志消息loggerChain.log(new LogMessage(LogLevel.INFO, "info级别日志"));loggerChain.log(new LogMessage(LogLevel.DEBUG, "debug级别日志"));loggerChain.log(new LogMessage(LogLevel.ERROR, "error级别日志"));}
}
  • 9.示例截图
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

个人学习笔记7-5:动手学深度学习pytorch版-李沐

#人工智能# #深度学习# #语义分割# #计算机视觉# #神经网络# 计算机视觉 13.10 转置卷积 例如&#xff0c;卷积层和汇聚层&#xff0c;通常会减少下采样输入图像的空间维度&#xff08;高和宽&#xff09;。然而如果输入和输出图像的空间维度相同&#xff0c;在以像素级分类…

c++基础入门二

C基础入门(二) 一、函数重载 在自然语言中&#xff0c;一句话或者一个词有不同的意思。例如&#xff1a;国乒和别人比赛是“谁也赢不了”&#xff0c;而国足和别人比赛是“谁也赢不了” 函数重载&#xff1a;是函数的一种特殊情况&#xff0c;C允许在同一作用域中声明几个功…

浪潮信息金风慧能:打造智慧新能源运营平台

近来&#xff0c;浪潮信息携手北京金风慧能技术有限公司&#xff08;简称“金风慧能”&#xff09;&#xff0c;共同发布了新能源场站集控中心的创新解决方案。该方案深度融合了浪潮信息的前沿服务器技术、软硬件一体化超融合方案及边缘计算产品与金风慧能自主研发的GW SCADA S…

C++进阶:多态

✨✨所属专栏&#xff1a;C✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ 多态的概念 多态(polymorphism)的概念&#xff1a;通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运⾏时多态(动态多态)&#xff0c;这⾥我们重点讲运⾏时多态。 编译时多态(静态多态)主…

车机中 Android Audio 音频常见问题分析方法实践小结

文章目录 前言1. 无声2. 断音3. 杂音4. 延迟播放5. 焦点问题6. 无声问题(连上 BT )其他完善中…… 前言 本文主要总结了一下车机开发中遇到的 Audio 有关的问题&#xff0c;同时参考网上的一案例&#xff0c;由于Audio 模块出现音频问题的场景很多&#xff0c;对每一个出现的问…

气压测试实验(用IIC)

I2C: 如果没有I2c这类总线&#xff0c;连接方法可能会如下图&#xff1a; 单片机所有的通讯协议&#xff0c;无非是建立在引脚&#xff08;高低电平的变换高低电平持续的时间&#xff09;这二者的组合上&#xff0c;i2c 多了一个clock线&#xff0c;负责为数据传输打节拍。 (i2…

linux-L3-linux 复制文件

linux 中要将文件file1.txt复制到目录dir中&#xff0c;可以使用以下命令 cp file1.txt dir/复制文件 cp /path/to/source/file /path/to/destination移动 mv /path/to/source/file /path/to/destination复制文件夹内的文件 cp -a /path/to/source/file /path/to/destinati…

【刷题】Day3--错误的集合

hello&#xff01;又见面啦~~~ 一道习题&#xff0c;要长脑子了...... 【. - 力扣&#xff08;LeetCode&#xff09;】 【思路】 /*** Note: The returned array must be malloced, assume caller calls free().*/void Bubble_sort(int arr[], int size) {int temp;for (int i…

校园安全无小事,EasyCVR视频综合管理平台助力智慧校园视频监控系统全面升级

随着信息技术的飞速发展&#xff0c;智慧校园作为教育信息化的重要载体&#xff0c;正逐步成为提升校园安全管理、优化教育资源配置、增强师生互动体验的关键手段。其中&#xff0c;高效、智能的视频监控系统作为智慧校园不可或缺的一部分&#xff0c;扮演着至关重要的角色。TS…

视频推拉流/直播点播EasyDSS平台安装失败并报错“install mediaserver error”是什么原因?

TSINGSEE青犀视频推拉流/直播点播EasyDSS平台支持音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务&#xff0c;在应用场景中可实现视频直播、点播、转码、管理、录像、检索、时移回看等。此外&#xff0c;平台还支持用户自行上传视频文件&#xff0c;也可…

《OpenCV计算机视觉》—— 图像金字塔

文章目录 什么是图像金字塔&#xff1f;一、定义与基本原理二、主要类型三、构建过程四、应用领域 图像金字塔中的下采样和上采样一、下采样&#xff08;Downsampling&#xff09;二、上采样&#xff08;Upsampling&#xff09;三、总结 代码实现 什么是图像金字塔&#xff1f;…

linux---压缩打包

linux打包和压缩文件和目录&#xff1a; 归档(打包)命令&#xff1a;tar 归档就是将多个文件或者目录打包成为一个文件&#xff0c;存放再磁盘中&#xff0c;方便文件或者目录丢失时&#xff0c;可以恢复。 归档文件名使用相对路径 &#xff08;注意区分归档文件和被归档文…

一家电子元件企业终止,业绩规模小,疑似通过收购调节收入利润

贝特电子终止原因如下&#xff1a;首先&#xff0c;报告期内贝特电子营收较低&#xff0c;收购东莞博钺股权可能构成重大资产重组&#xff0c;且假如扣除报告期内来自东莞博钺的净利润&#xff0c;贝特电子的净利润恐怕不符合深交所上市标准&#xff1b;其次&#xff0c;交易所…

QT之QML学习五:添加自定义Qml组件,以及组件管理

开发环境: 1、Qt 6.7.2 2、Pyside6 3、Python 3.11.4 4、Windows 10 重要的事情说三遍,使用自定义qml参考链接: Qt官网参考网址!!! 重要的事情说三遍,使用自定义qml参考链接: Qt官网参考网址!!! 重要的事情说三遍,使用自定义qml参考链接: Qt官网参考网址!!!…

第四天旅游线路预览——从换乘中心到喀纳斯湖

第四天&#xff1a;从贾登峪到喀纳斯风景区入口&#xff0c;晚上住宿贾登峪&#xff1b; 换乘中心有4 路车&#xff0c;喀纳斯①号车&#xff0c;去喀纳斯湖&#xff0c;路程时长约5分钟&#xff1b; 将上面的的行程安排进行动态展示&#xff0c;具体步骤见”Google earth stu…

List<Map<String, Object>>汇总统计排序

开发环境&#xff1a;jdk 1.8 需求一&#xff1a; 1、统计每个小时(升序)不同事件的产品产量 2、统计不同事件&#xff08;OK 、NG&#xff09;的总产量 public static void main(String[] args) {//数据源List<Map<String, Object>> list new ArrayList<Map…

使用 PyCharm 新建 Python 项目详解

使用 PyCharm 新建 Python 项目详解 文章目录 使用 PyCharm 新建 Python 项目详解一 新建 Python 项目二 配置环境1 项目存放目录2 Python Interpreter 选择3 创建隔离环境4 选择你的 Python 版本5 选择 Conda executable 三 New Window 打开项目四 目录结构五 程序编写运行六 …

多人开发小程序设置体验版的痛点

抛出痛点 在分配任务时,我们将需求分为三个分支任务,分别由前端A、B、C负责: 前端A: HCC-111-实现登录功能前端B: HCC-112-实现用户注册前端C: HCC-113-实现用户删除 相应地,我们创建三个功能分支: feature_HCC-111-实现登录功能feature_HCC-112-实现用户注册feature_HCC-1…

uView使用心得

说实话我不爱用这个库&#xff0c;感觉很鸡肋&#xff0c;坑很多&#xff0c;可能没用习惯 picker选择器 绑定默认值是通过设置index&#xff0c;并且这个index需要通过api设置进去&#xff0c;设置defalutindex绑定值无效&#xff08;只有初始化可以&#xff0c;后面动态改变…

半导体制造技术中的沉积和驱入(Deposition and drive-in)过程

来源&#xff1a;半导体制造技术导论——萧宏 沉积和驱入过程 图5.34 硼掺杂工艺高温扩散炉系统示意图 图5.35 扩散掺杂工艺流程 图5.36 扩散工艺在超浅结深&#xff08;USJ&#xff09;上的应用