设计模式: 责任链模式

embedded/2024/11/14 12:40:00/

目录

一,责任链模式

二,特点

四,实现步骤

五,代码


一,责任链模式

责任链模式(Chain of Responsibility Pattern)是一种软件设计模式,它属于行为型模式。在这种模式中,一个请求沿着一个由多个处理对象组成的链顺序传递,直到链上的某个处理对象能够处理该请求为止。每个处理对象决定是处理该请求、拒绝它,还是将其传递给链中的下一个处理对象。

二,特点

  1. 解耦:将请求的发送者和接收者解耦,使得发送者不需要知道谁是请求的处理者,以及链的结构如何。

  2. 动态性:在运行时,可以动态地改变链的结构,例如增加或删除链中的某些处理对象。

  3. 避免请求发送者与接收者之间的耦合:请求发送者只需要知道链的头部,而不需要了解链的其余部分。

  4. 易于扩展:可以根据需要添加新的请求处理对象,而不需要修改现有代码

三,组成部分

  • Handler:定义了一个处理请求的接口,通常包含一个指向下一个处理者的引用。
  • ConcreteHandler:实现了Handler接口的具体处理类,决定是否处理请求或将请求传递给下一个处理者。

四,实现步骤

  1. 定义Handler接口,包含setNext()方法用于设置链的下一个处理者,以及handleRequest()方法用于处理请求。
  2. 创建具体的处理者类,实现Handler接口,并在handleRequest()方法中实现具体的请求处理逻辑。
  3. 将处理者对象通过setNext()方法连接起来,形成一条处理链。
  4. 发送请求,从链的开始传递,直到被处理或传递到链的末尾。

五,代码

1.创建抽象的记录器类。

public abstract class AbstractLogger {public static int INFO = 1;public static int DEBUG = 2;public static int ERROR = 3;protected int level;//下一个元素AbstractLogger nextLogger;protected void nextLogger(AbstractLogger nextLogger) {this.nextLogger = nextLogger;}public void logMessage(int level, String message) {if (this.level <= level) {//如果小于传入的,那么打印出来write(message);}if (nextLogger != null) {nextLogger.logMessage(level, message);//下一个}}abstract protected void write(String message);
}

2.创建扩展了该记录器类的实体类。

public class ConsoleLogger extends AbstractLogger{//控制台日志public ConsoleLogger(int level){this.level = level;}@Overrideprotected void write(String message) {System.out.println("Standard Console::logger" + message);}
}
public class ErrorLogger extends AbstractLogger{public ErrorLogger(int level){this.level = level;}@Overrideprotected void write(String message) {System.out.println("Error Console::logger" + message);}
}
public class FileLogger extends AbstractLogger{public FileLogger(int level){this.level = level;}@Overrideprotected void write(String message) {System.out.println("File Console::logger" + message);}
}

3.创建不同类型的记录器。赋予它们不同的错误级别,并在每个记录器中设置下一个记录器。每个记录器中的下一个记录器代表的是链的一部分。

public class ChainPatternDemo {public static AbstractLogger getChains(){AbstractLogger error = new ErrorLogger(AbstractLogger.ERROR);//3AbstractLogger file = new FileLogger(AbstractLogger.DEBUG);//2AbstractLogger console = new ConsoleLogger(AbstractLogger.INFO);//1error.nextLogger(file);file.nextLogger(console);return error;//3}public static void main(String[] args) {AbstractLogger chains = getChains();chains.logMessage(AbstractLogger.INFO,"This is an information.");//1chains.logMessage(AbstractLogger.DEBUG,"This is a debug level information.");//2chains.logMessage(AbstractLogger.ERROR,"This is an error information.");//3}
}

4.输出


http://www.ppmy.cn/embedded/34493.html

相关文章

代码随想录第61天 | 739. 每日温度 、 496.下一个更大元素 I

一、前言 参考文献&#xff1a;代码随想录&#xff1b; 终于结束了动态规划了&#xff0c;今天的主题就是单调栈&#xff1b; 单调栈的作用就是将你之前遍历过的数组以单调的形式存到栈中&#xff0c;方便对数据进行判断&#xff1b; 二、每日温度 1、思路&#xff1a; &…

导数之光:探寻机器学习中的微变奥秘

在当今这个数据驱动的时代&#xff0c;机器学习以其强大的学习和预测能力&#xff0c;成为了推动科技进步的重要力量。而在机器学习的背后&#xff0c;数学原理&#xff0c;尤其是导数的应用&#xff0c;为其提供了坚实的理论支撑。本文将详细探讨导数在机器学习中的体现&#…

条款4:非必要不提供default constructor

所谓default constructor&#xff08;也就是说不给任何自变量就可调用者&#xff09;是C一种“无中生有”的方式。 Constructors 用来将对象初始化&#xff0c;所以default constructors的意思是在没有任何外来信息的情况将对象初始化。 有时候可以想象&#xff0c;例如&…

JVS物联网平台的通道连接管理的核心技能

通道连接的管理 界面说明 从通道管理菜单&#xff0c;进入通道管理页面&#xff0c;如下图所示&#xff0c;左侧是连接的通道管理&#xff08;采用树形模式进行管理&#xff09;&#xff0c;右侧是与之对应的采集点位&#xff1a; 新建连接 点击连接“”&#xff0c;系统弹出…

微信小程序miniprogram_npm目录主包太大如何处理

在使用TDesign开发小程序&#xff0c;miniprogram_npm目录下很多组件&#xff0c;感觉很多组件我都没引用&#xff0c;为什么都在主包来&#xff0c;导致主包很大。如何优化&#xff1f; 在使用npm构建后生成的miniprogram_npm目录里&#xff0c;有所有TDesign组件。但是有很…

nodejs的ws+vue3编写聊天室的demo

nodejs编写ws服务是非常简单高效的&#xff0c;nodejs有众多的实现ws的库&#xff0c;如ws,SocketIO等&#xff0c;nodejs的事件线程是单线程的&#xff0c;所以不要在事件线程内做阻塞性的操作&#xff0c;耗时的操作交给工作线程或者子进程操作。 我使用nodejsvue3实现了写了…

发卡授权盗u源码系统搭建ZHU16728

2024最新UI发卡盗U/支持多语言/更新UI界面/支持多个主流钱包去除后门板&#xff0c;搭建系统TGaqxm01 。功能完美。 此套系统二开后完美授权成功&#xff0c;百分百授权。不是市面上那种授不了权的那种。 授权额度Unlimited 懂的都懂。 1.Php静态 2.目录puicta 3.扩sal 4.ss…

webpack学习笔记

这里写目录标题 webpack构建流程:基础配置拆分配置,合并配置loader处理图片样式 webpack-dev-server使用多入口抽离css公共代码sourceMapHMR模块热更新性能优化 webpack构建流程: 初始化参数,从配置文件和shell语句中读取和合并参数,得到最终的参数开始编译,用上一步得到的参数…