当前位置: 首页 > news >正文

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

目录

          • 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.示例截图
    在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Tube Qualify三维弯管测量系统用于弯管机修正弯管回弹参数
  • 一维数组的概念和应用
  • Excel单元格操作:读写单元格数据、格式设置与条件格式详解
  • 1.C_数据结构_基本知识
  • 第4章-03-用WebDriver获取页面Cookie
  • HarmonyOS开发5.0【rcp网络请求】
  • 【Android笔记】Android Studio打包 提示Invalid keystore format
  • OpenCV结构分析与形状描述符(14)拟合直线函数fitLine()的使用
  • 【白话MQ】消息队列MQ的使用和选型
  • 油耳用什么掏耳朵比较好?质量最好的可视挖耳勺推荐
  • 智慧黑板:赋能多学科教学,引领教育新风尚
  • CentOS 系统设置与维护教程
  • Apple发布会都有哪些亮点?如何在苹果手机和电脑上录制屏幕?
  • JVM面试真题总结(六)
  • 深入理解Java虚拟机:Jvm总结-垃圾收集器与内存分配策略
  • 分享的文章《人生如棋》
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • Android优雅地处理按钮重复点击
  • centos安装java运行环境jdk+tomcat
  • EventListener原理
  • fetch 从初识到应用
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • JavaScript设计模式系列一:工厂模式
  • Java应用性能调优
  • MobX
  • mongo索引构建
  • 简单实现一个textarea自适应高度
  • 小程序01:wepy框架整合iview webapp UI
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (03)光刻——半导体电路的绘制
  • (6)STL算法之转换
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (五)关系数据库标准语言SQL
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (学习总结16)C++模版2
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)树状数组
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .Net插件开发开源框架
  • .NET单元测试使用AutoFixture按需填充的方法总结
  • @angular/cli项目构建--Dynamic.Form
  • [ C++ ] 类和对象( 下 )
  • []常用AT命令解释()
  • [2010-8-30]
  • [android]-如何在向服务器发送request时附加已保存的cookie数据