设计模式(行为型模式)责任链模式

目录

    • 一、简介
    • 二、责任链模式
      • 2.1、处理器接口
      • 2.2、具体处理器类
      • 2.3、使用
    • 三、优点与缺点

一、简介

  责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理该请求为止。这种模式解耦了发送者和接收者之间的关系,允许多个对象对请求进行处理,但发送者无需知道请求的处理过程和最终哪个对象处理了它。

  在责任链模式中,请求通常沿着一个对象链传递,每个处理者对象都包含了自己的处理逻辑和对下一个处理者的引用。当收到请求时,处理者可以选择自行处理、部分处理或将请求传递给链中的下一个处理者。该模式通常包含以下角色:

  • Handler(抽象处理者): 定义了处理请求的接口,通常包含一个指向下一个处理者的引用。
  • ConcreteHandler(具体处理者): 实现抽象处理者接口,在接收到请求后,如果能够处理则处理请求,否则将请求传递给下一个处理者。

  责任链模式能够动态地建立请求的处理链,可以灵活地添加、移除或调整处理者对象,根据需求自由组合处理链。这样可以避免请求发送者和接收者之间的直接耦合,提高了系统的灵活性和可维护性。

二、责任链模式

  当涉及责任链模式时,可以创建一个处理器接口 Logger 和具体的处理器类 DebugLogger、InfoLogger、WarningLogger、ErrorLogger 和 FatalLogger。每个处理器类都可以处理相应级别的日志,如果不能处理,则将日志传递给下一个处理器

2.1、处理器接口

// 处理器接口
public interface Logger {void setNextLogger(Logger nextLogger);void logMessage(int level, String message);
}

2.2、具体处理器类

DebugLogger

public class DebugLogger implements Logger {private Logger nextLogger;@Overridepublic void setNextLogger(Logger nextLogger) {this.nextLogger = nextLogger;}@Overridepublic void logMessage(int level, String message) {if (level <= 1) {System.out.println("Debug Logger: " + message);} else if (nextLogger != null) {nextLogger.logMessage(level, message);}}
}

InfoLogger

public class InfoLogger implements Logger {private Logger nextLogger;@Overridepublic void setNextLogger(Logger nextLogger) {this.nextLogger = nextLogger;}@Overridepublic void logMessage(int level, String message) {if (level <= 2) {System.out.println("Info Logger: " + message);} else if (nextLogger != null) {nextLogger.logMessage(level, message);}}
}

WarningLogger

public class WarningLogger implements Logger {private Logger nextLogger;@Overridepublic void setNextLogger(Logger nextLogger) {this.nextLogger = nextLogger;}@Overridepublic void logMessage(int level, String message) {if (level <= 3) {System.out.println("Warning Logger: " + message);} else if (nextLogger != null) {nextLogger.logMessage(level, message);}}
}

ErrorLogger

public class ErrorLogger implements Logger {private Logger nextLogger;@Overridepublic void setNextLogger(Logger nextLogger) {this.nextLogger = nextLogger;}@Overridepublic void logMessage(int level, String message) {if (level <= 4) {System.out.println("Error Logger: " + message);} else if (nextLogger != null) {nextLogger.logMessage(level, message);}}
}

FatalLogger

public class FatalLogger implements Logger {private Logger nextLogger;@Overridepublic void setNextLogger(Logger nextLogger) {this.nextLogger = nextLogger;}@Overridepublic void logMessage(int level, String message) {if (level <= 5) {System.out.println("Fatal Logger: " + message);} else if (nextLogger != null) {nextLogger.logMessage(level, message);}}
}

2.3、使用

// 测试类
public class ChainOfResponsibilityExample {public static void main(String[] args) {Logger debugLogger = new DebugLogger();Logger infoLogger = new InfoLogger();Logger warningLogger = new WarningLogger();Logger errorLogger = new ErrorLogger();Logger fatalLogger = new FatalLogger();// 构建责任链debugLogger.setNextLogger(infoLogger);infoLogger.setNextLogger(warningLogger);warningLogger.setNextLogger(errorLogger);errorLogger.setNextLogger(fatalLogger);// 测试责任链debugLogger.logMessage(2, "This is an info message.");debugLogger.logMessage(4, "This is an error message.");debugLogger.logMessage(5, "This is a fatal message.");}
}

运行结果:

Info Logger: This is an info message.
Error Logger: This is an error message.
Fatal Logger: This is a fatal message.

  在这个示例中,我们创建了多个具体的处理器类来处理不同级别的日志。通过构建责任链,每个处理器类中实现了处理逻辑,并且能够将日志传递给下一个处理器,直至最终处理。在测试类中,演示了发送不同级别的日志请求,并观察责任链的处理过程。

三、优点与缺点

  责任链模式有一些优点和缺点,让我们来看一下:

优点

  • 降低耦合度: 将请求发送者和接收者解耦,发送者无需知道请求的处理者,也不需要知道请求是如何被处理以及谁来处理。
  • 灵活性和可扩展性:可以动态地调整、增加或删除处理者对象,也可以改变它们之间的顺序,以满足不同的处理需求。
  • 单一职责原则: 每个具体处理者都专注于自己的处理逻辑,使得系统更加符合单一职责原则。

缺点

  • 请求处理不保证被执行:如果请求没有被任何处理者处理,可能会出现未处理的情况,这需要在设计时考虑清楚。
  • 性能问题:如果责任链太长或者处理者逻辑过于复杂,可能会影响性能。同时,递归地向下传递请求可能会影响性能。

  责任链模式适合处理对象之间存在多种处理方式的情况,但在使用时需要注意权衡,避免责任链过长、过于复杂,以及处理者责任划分不清晰等问题。

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

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

相关文章

【MATLAB源码-第137期】基于matlab的NOMA系统和OFDMA系统对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 NOMA&#xff08;非正交多址&#xff09;和OFDMA&#xff08;正交频分多址&#xff09;是两种流行的无线通信技术&#xff0c;广泛应用于现代移动通信系统中&#xff0c;如4G、5G和未来的6G网络。它们的设计目标是提高频谱效…

如何使用C#调用LabVIEW算法

新建一个工程 这是必须的&#xff1b; 创建项目 项目 点击完成&#xff1b; 将项目另存为&#xff1b;方便后续的使用&#xff1b; 创建 一个测试VI 功能很简单&#xff0c;用的一个加法&#xff1b;将加数A&#xff0c;B设置为输入&#xff0c;和C设置为输出&#xff0c;…

正点原子--STM32通用定时器学习笔记(2)

1. 通用定时器输入捕获部分框图介绍 捕获/比较通道的输入部分&#xff08;通道1&#xff09; 输入通道映射CC1S[1:0]→采样频率CKD[1:0]→滤波方式IC1F[3:0]→边沿检测方式CC1P→捕获分频ICPS[1:0]→使能捕获CC1E 输入部分对相应的TIx输入信号采样&#xff0c;并产生一个滤波后…

MPLS——多协议标签交换

目录 1 多协议标签交换 MPLS 1.1 MPLS 的工作原理 1.1.1 MPLS 工作特点 1.1.2 MPLS 协议的基本原理 1.1.3 MPLS 的基本工作过程 1.2 转发等价类 FEC 1.2.1 FEC 用于负载平衡 1.3 MPLS 首部的位置与格式 1.3.1 MPLS 首部的位置 1.3.2 MPLS 首部的格式 1.4 新一代的…

STM32 HAL NTC(3950 10k)查表法

NTC&#xff08;Negative Temperature Coefficient&#xff09;是指随温度上升电阻呈指数关系减小、具有负温度系数的热敏电阻现象和材料。该材料是利用锰、铜、硅、钴、铁、镍、锌等两种或两种以上的金属氧化物进行充分混合、成型、烧结等工艺而成的半导体陶瓷&#xff0c;可制…

vue项目开发vscode配置

配置代码片段 步骤如下&#xff1a; 文件->首选项->配置用户代码片段新增全局代码片段起全局代码片段文件名“xxx.code-snippets” 这里以配置vue2初始代码片段为例&#xff0c;配置具体代码片段 {"name": "vue-sph","version": "…

modelsim仿真使用到vivado的IP,该如何使用!

modelsim仿真时&#xff0c;如果使用到了vivado的IP就会报错&#xff0c;本次就告诉大家如何将vivado的IP添加到modelsim中直接仿真。 一、生成ini文件以及IP打包 打开vivado&#xff0c;点击上方的Tools-->Compile Simulation Libraries得到如下界面 simulator&#xff1…

【Python基础】案例分析:泰坦尼克分析

泰坦尼克分析 1 目的&#xff1a; 熟悉数据集熟悉seaborn各种操作作 import pandas as pd import seaborn as sns import numpy as np import matplotlib.pyplot as plt %matplotlib inline home rdata df sns.load_dataset(titanic, data_homehome) df.head()survivedpcl…

#P12365. 相逢是首歌

Description monkey A与monkey B住在一颗树上&#xff0c;每天他们都会相约一起出去玩。 q次询问&#xff0c;每次询问给两个点x和y&#xff0c;代表他们各自的出发点&#xff0c;他们以相同的速度&#xff0c;沿着二者的最短路前进. 问二者会在点上相遇&#xff0c;还是在边…

mmdetection使用自己的voc数据集训练模型实战

一.自己数据集整理 将labelimg格式数据集进行整理 1.1. 更换图片后缀为jpg import os import shutilroot_path/media/ai-developer/imgfileos.listdir(root_path)for img in file:if img.endswith(jpeg) or img.endswith(JPG) or img.endswith(png):img_pathos.path.join(root…

理想汽车学华为,年终奖红包有点大(含算法原题)

理想年终奖红包 2月5日&#xff0c;有微博用户发帖称&#xff0c;脉脉上看到&#xff0c;今年理想汽车的年终奖红包有点大。 对此&#xff0c;李想转发并评论&#xff1a; ❝ 不能只学华为的流程&#xff0c;而不学华为的利益分配。奖罚不分明&#xff0c;是组织低效的最大原因…

C++ lambda [],[=] ,[],[this] 的使用

在c11标准中引入了lambda表达式&#xff0c;一般用于定义匿名函数 [],[] ,[&],[this] 都是捕获列表 [] 的作用&#xff1a; 什么也不捕获 [] 的作用&#xff1a; 按值捕获所有变量 [&] 的作用&#xff1a; 引用捕获所有外部作用域内的变量 [this]的作用&#xf…

怎么理解 Redis 事务

背景 在面试中经常会被问到&#xff0c;redis支持事务吗&#xff1f;事务是怎么实现的&#xff1f;事务会回滚吗&#xff1f;又是一键三连&#xff0c;我下面分析下&#xff0c;看看能不能吊打面试官 什么是Redis事务 事务是一个单独的隔离操作&#xff1a;事务中的所有命令…

【SpinalHDL】1. Getting Started

1. Getting Started 1.1 SpinalHDL开发环境的搭建 开发环境的搭建参考SpinalHDL 开发环境搭建一步到位&#xff08;图文版&#xff09; - 极术社区 - 连接开发者与智能计算生态就可以了&#xff0c;so detail. 重点在于sbt切换为国内源&#xff0c;可以参考如下链接Windows上…

企业为什么选择SASE?香港电讯专家给你答案!

2019年&#xff0c;Gartner发布了全新的网络安全模型&#xff1a;安全访问服务边缘&#xff08;Secure Access Service Edge, SASE&#xff09;&#xff0c;并预测到2025年80%的企业将使用SASE/SSE架构统一网络、云服务和私人应用程序的安全访问。那么企业为什么选择SASE&#…

Web课程学习笔记--CSS-Position学习

CSS Position学习 CSS Position有四个属性&#xff1a; relativeabsolutefixedstatic&#xff08;默认&#xff09; 样例 <div id"parent"><div id"sub1">sub1</div><div id"sub2">sub2</div> </div>su…

Git合并多个commit

git rebase -i commitId 假设想要合并最后3个commit&#xff0c; git log显示 commit id 1 commit id 2 commit id 3 commit id 4 则执行git rebase -i commitId4. 注意是4&#xff0c;不是3. 然后&#xff0c;pick最老的commit (commit id 3). https://blog.csdn.net/qiao…

企业计算机服务器中了mallox勒索病毒怎么办,mallox勒索病毒处理流程

由于网络技术的不断发展与应用&#xff0c;越来越多的企业开始依赖计算机技术来提高企业效率。然而&#xff0c;网络安全威胁无处不在&#xff0c;严重影响着企业计算机服务器中的数据安全。近期&#xff0c;云天数据恢复中心接到许多中大型企业的求助&#xff0c;企业的多台服…

Quicker读取浏览器的书签(包括firefox火狐)

从edge换了火狐&#xff0c;但是quicker不能读取本地的bookmarks文件了&#xff0c;就研究了一下。 方法1&#xff1a;读取本地Bookmarks文件&#xff08;仅谷歌内核浏览器&#xff09; 谷歌内核的浏览器本地会有Bookmarks文件&#xff0c;放了所有的书签数据&#xff0c;直接…

社群团购有没有销量,到底需要不需要做呢?

私域社群团购价值有多大&#xff1f; 私域社群团购渠道到底怎么样&#xff1f;发展前景如何呢&#xff1f; 社群团购有没有销量&#xff1f;需要不需要做呢&#xff1f; 对接合作社群团购平台麻不麻烦&#xff1f; 上面的问题&#xff0c;相信做社群团购平台可能都会遇上的…