设计模式 - 责任链模式

news/2025/1/5 18:00:58/文章来源:https://www.cnblogs.com/Tangtang1997/p/18650320

概述

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它通过将请求沿着处理者链传递,直到有一个处理者处理它为止。责任链模式使得多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合。通过将请求的处理者连成一条链,责任链模式可以动态地指定处理者的顺序。

结构

责任链模式包含以下几个角色:

  1. 处理者(Handler):定义一个处理请求的接口,并实现后继链的设置。
  2. 具体处理者(ConcreteHandler):实现处理者接口,处理它所负责的请求,或者将请求传递给后继者。
  3. 客户端(Client):向链上的具体处理者对象提交请求。

示例代码

假设我们有一个应用程序需要处理不同级别的日志消息(如信息、警告和错误)。
代码地址

处理者接口

public abstract class Logger
{protected Logger _nextLogger;public void SetNextLogger(Logger nextLogger){_nextLogger = nextLogger;}public void LogMessage(int level, string message){if (CanHandle(level)){Write(message);}else if (_nextLogger != null){_nextLogger.LogMessage(level, message);}}protected abstract bool CanHandle(int level);protected abstract void Write(string message);
}

具体处理者

public class InfoLogger : Logger
{protected override bool CanHandle(int level){return level == 1;}protected override void Write(string message){Console.WriteLine("InfoLogger: " + message);}
}public class WarningLogger : Logger
{protected override bool CanHandle(int level){return level == 2;}protected override void Write(string message){Console.WriteLine("WarningLogger: " + message);}
}public class ErrorLogger : Logger
{protected override bool CanHandle(int level){return level == 3;}protected override void Write(string message){Console.WriteLine("ErrorLogger: " + message);}
}

客户端代码

class Program
{static void Main(string[] args){Logger infoLogger = new InfoLogger();Logger warningLogger = new WarningLogger();Logger errorLogger = new ErrorLogger();infoLogger.SetNextLogger(warningLogger);warningLogger.SetNextLogger(errorLogger);infoLogger.LogMessage(1, "This is an information.");infoLogger.LogMessage(2, "This is a warning.");infoLogger.LogMessage(3, "This is an error.");}
}

应用场景

责任链模式适用于以下场景:

  1. 多个对象可以处理同一个请求:具体处理者之间可以动态指定处理顺序。
  2. 一个请求需要多个对象进行处理:可以动态地添加或删除处理者。
  3. 请求的处理者不明确:客户端不需要知道请求的处理者是谁,处理者可以在运行时动态确定。

优缺点

优点

  • 降低耦合度:责任链模式通过将请求的发送者和接收者解耦,使得多个对象都有机会处理请求。
  • 动态组合:可以根据需要动态地组合处理者,增加系统的灵活性和可扩展性。

缺点

  • 请求处理不保证:如果链上的所有处理者都不能处理请求,可能会导致请求得不到处理。
  • 性能开销:责任链模式可能会增加系统的性能开销,特别是当链条过长时。

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

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

相关文章

PCIe扫盲——基地址寄存器(BAR)详解

基地址寄存器(BAR)在配置空间(Configuration Space)中的位置如下图所示:其中Type0 Header最多有6个BAR,而Type1 Header最多有两个BAR。这就意味着,对于Endpoint来说,最多可以拥有6个不同的地址空间。但是实际应用中基本上不会用到6个,通常1~3个BAR比较常见。 主要注意…

使用标签策略规范资源上的标签

阿里云标签服务提供了标签策略功能,能够帮助企业解决在标签使用过程中遇到的漏打标签、标签拼写错误等问题,同时为用户提供了自动打标的能力。引言 阿里云标签服务提供了标签策略功能,能够帮助企业解决在标签使用过程中遇到的漏打标签、标签拼写错误等问题,同时为用户提供了…

java字符串拼接遇到null你会处理吗

现有一个场景,对于发票信息,需要把信息中的地址和电话进行拼接,开户号和账号进行拼接,那应该怎么做?最简单的方法是使用+拼接,但问题是如果有个字段为空,是null,那么拼接结果是什么样的?来个下面的示例public static void main(String[] args) {String a = null;Strin…

欧拉OpenEuler安装tomcat.241227

1. 安装tomcat unzip tomcat.zip mv tomcat /home/ cd /home/tomcat chmod +x *.sh cd bin chmod +x *.sh/home/tomcat下 三个sh 进行启动关闭 2. 开web端口 firewall-cmd --list-ports firewall-cmd --permanent --add-port=9090/tcp firewall-cmd --reload.zstitle { width:…

03CommonsCollections1

CC链的介绍Apache Commons 当中有⼀个组件叫做 Apache Commons Collections ,主要封装了Java 的 Collection(集合) 相关类对象,它提供了很多强有⼒的数据结构类型并且实现了各种集合工具类。 作为Apache开源项⽬的重要组件,Commons Collections被⼴泛应⽤于各种Java应⽤的开…

MYSQL数据库导出导入脚本.250102

以test数据库为例:一、导出数据库 /usr/local/mysql/bin/mysqldump -uroot -p test --routines | gzip > test_250102.sql.gz二、导入数据库 gunzip < /root/test_250102.sql.gz | /usr/local/mysql/bin/mysql -uroot -p test.zstitle { width: 280px; text-align: cent…

Github + Jekyll 搭建项目wiki

网站托管 创建新仓库 创建以自己名字为前缀, .github.io​为后缀的仓库 ​​ 在仓库的Settings中的Pages里设置Build and deployment​为Github Action​ ​​ 过一会即可跳转域名访问自己的页面 ​​ ‍ fork仓库 另外一种方法, 直接fork主题仓库,可以从官方主题这里获取更多。…

Postman安装及汉化教程 | 手把手教你轻松搞定

前言 Postman 是一款功能强大的 API 测试工具,深受开发者喜爱。然而,原版 Postman 是英文界面,对于习惯中文的用户可能不够友好。本教程详细介绍如何下载安装 Postman 并成功实现汉化,适合零基础用户。一、下载安装包 首先,获取 Postman 的安装包及对应汉化包: 👉 点击…

Postman安装及汉化操作全解(含图文步骤)

前言 Postman 是一款功能强大的 API 测试工具,深受开发者喜爱。然而,原版 Postman 是英文界面,对于习惯中文的用户可能不够友好。本教程详细介绍如何下载安装 Postman 并成功实现汉化,适合零基础用户。一、下载安装包 首先,获取 Postman 的安装包及对应汉化包: 👉 点击…

国产高性能CPU米尔瑞芯微RK3576赋能AIoT、工业、智能显示终端

随着市场需求不断的变化,各行各业对CPU的要求越来越高,特别是近几年流行的 AIOT,为了有更好的用户体验,CPU的算力就要求更高了。今天为大家推荐由米尔基于瑞芯微RK3576处理器推出的MYC-LR3576核心板及开发板。关于RK3576处理器国产CPU,是这些年的骄傲,华为手机全国产化,…

《IT项目管理》 - 课程笔记

Chapter 1. 项目管理概述 哪些是项目,哪些不是项目?为某银行客户开发、安装网上银行支付系统 √ 负责网上银行系统的销售工作 在2022年销售20套以上的网上银行系统 √ 为某银行的网上银行系统提供售后服务 建立客户售后服务热线 √ 管理售后服务热线,接听客户来电…