设计模式-责任链模式

server/2024/10/18 0:39:03/
作者持续关注 WPS二次开发专题系列,持续为大家带来更多有价值的WPS开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(QQ:250325397)

目录

定义

特点

使用场景

优缺点

(1) 优点

(2) 缺点

模式结构

具体实现

实际应用

定义

责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

特点

避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

使用场景

    • 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
    • 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
    • 可动态指定一组对象处理请求。

优缺点

(1) 优点
    • 降低耦合度。它将请求的发送者和接收者解耦。
    • 简化了对象。使得对象不需要知道链的结构。
    • 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
    • 增加新的请求处理类很方便。
(2) 缺点
    • 不能保证请求一定被接收。
    • 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
    • 可能不容易观察运行时的特征,有碍于除错。

模式结构

    • 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
    • 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
    • 客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

责任链模式的本质是解耦请求与处理,让请求在处理链中能进行传递与被处理;理解责任链模式应当理解其模式,而不是其具体实现。责任链模式的独到之处是将其节点处理者组合成了链式结构,并允许节点自身决定是否进行请求处理或转发,相当于让请求流动起来。

具体实现

抽象类


/*** 日志接口*/
public interface ILogger {int INFO = 1;int DEBUG = 2;int ERROR = 3;/*** 记录日志* @param level 日志级别* @param msg 日志内容*/void doLogger(int level, String msg, LoggerChain chain);
}/*** 控制台打印日志*/
public class ConsoleLogger implements ILogger {@Overridepublic void doLogger(int level, String msg, LoggerChain chain) {//处理当前日志打印System.out.println("Console Logger::[" + level + "] " + msg);//继续向下处理chain.doLogger(level, msg, chain);}
}/*** file级别的日志*/
public class FileLogger implements ILogger {@Overridepublic void doLogger(int level, String msg, LoggerChain chain) {//处理当前日志打印,写入到文件中System.out.println("Filter Logger::[" + level + "] " + msg);//继续向下处理chain.doLogger(level, msg, chain);}
}/*** 日志校验器*/
public class ValidateLogger implements ILogger {@Overridepublic void doLogger(int level, String msg, LoggerChain chain) {msg = msg.replace("sdcard", "xxx");chain.doLogger(level, msg, chain);}
}

责任链类

/*** 日志处理器链*/
public class LoggerChain implements ILogger {//日志处理器列表private List<ILogger> loggerList = new ArrayList<>();//当前处理的索引,从0开始private int index;/*** 添加日志处理器*/public LoggerChain addLogger(ILogger logger) {loggerList.add(logger);return this;}@Overridepublic void doLogger(int level, String msg, LoggerChain chain) {if (index == loggerList.size()) {//处理到最后,则返回return;}//继续使用下一个日志处理器处理ILogger logger = loggerList.get(index);index ++;logger.doLogger(level, msg, chain);}
}

具体使用

public class App {public static void main(String[] args) {LoggerChain logger = new LoggerChain();logger.addLogger(new ConsoleLogger())//可添加日志敏感内容过滤器或者日志加密器.addLogger(new ValidateLogger()).addLogger(new FileLogger());logger.doLogger(ILogger.INFO, "This is a test log msg, file path:/sdcard/test/test.pdf", logger);}
}

实际应用

  1. Spring中的拦截器,Servlet中的过滤器
  2. Android中View的touch事件冒泡

http://www.ppmy.cn/server/40374.html

相关文章

单片机-点亮第一盏灯

原理图 需求&#xff1a;点亮或是熄灭LED 通过控制 P5.3引脚输出高电平时&#xff0c;LED灯就点亮&#xff0c;输出低电平时LED灯就熄灭 1.项目创建 新建项目 配置开发板信息 当前位STC芯片的开发板&#xff0c;选择STC MCU Database 搜素具体芯片型号&#xff0c;进行配置…

获取Android Native堆栈

文章目录 一、使用unwind函数1.1 工具和方法1.2 获取当前线程的堆栈信息1.3 libunwind的相关接口1.3.1 _Unwind_Backtrace1.3.2 _Unwind_GetIP1.3.3 在不同Android版本中的可用性 二、手动遍历栈帧来实现获取堆栈信息2.1 ARM64架构下的示例代码2.2 ARM架构下的示例代码2.3 寄存…

linux性能监控之sar

1.sar命令介绍 sar是一个非常全面的分析工具&#xff0c;可以对文件的读写&#xff0c;系统调用的使用情况&#xff0c;磁盘IO&#xff0c;CPU相关使用情况&#xff0c;内存使用情况&#xff0c;进程活动等都可以进行有效的分析。 sar工具将对系统当前的状态进行取样&am…

【算法】滑动窗口——将x减到0的最小操作数

本节博客主要是讲的我解“将x减到0的最小操作数”这道题的思路历程&#xff0c;从最开始的想法到代码提交的详细记录&#xff0c;有需要借鉴即可。 目录 1.题目2.代码示例3.细节3.1left越界3.2特殊情况 4.总结 1.题目 题目链接&#xff1a;LINK 看题目意思是就是给你一个数X&…

Spring Boot 集成 sa-token 实践教程

Spring Boot 集成 sa-token 实践教程 sa-token 是一个轻量级且功能强大的权限认证框架&#xff0c;它基于Java语言&#xff0c;专为Java开发者设计&#xff0c;以简化权限管理的复杂性。在Spring Boot项目中集成sa-token&#xff0c;可以快速实现会话管理、权限控制等功能。本文…

【随想录】Day45—第九章 动态规划part07

目录 题目1: 70. 爬楼梯&#xff08;进阶版&#xff09;1- 思路动规五部曲 2- 题解⭐爬楼梯——题解思路 题目2: 零钱兑换1- 思路动规五部曲 2- 题解⭐零钱兑换——题解思路 题目3:完全平方数1- 思路动规五部曲 2- 题解⭐完全平方数——题解思路 题目1: 70. 爬楼梯&#xff08;…

地球洋流地图

Earth Null School 以其对我们星球的凉爽风和温度可视化而闻名。但地球 Nullschool 的一个鲜为人知的网络地图是他们的洋流地图。 如你所见&#xff0c;热水从赤道流向两极。例如&#xff0c;墨西哥湾流将暖空气推向欧洲&#xff0c;由于热水流经大西洋&#xff0c;使气候更加…

最佛系的打字练习软件——TL(TypeLetters)

有朋友开玩笑说&#xff1a;TL&#xff08;TypeLetters&#xff09;是最佛系的打字练习软件。真的吗&#xff1f;仔细看&#xff0c;好像还真有这么点意思&#xff1a; 无竞速&#xff1a;TL没有速度显示&#xff0c;初学者逐个认清键位&#xff0c;无需关心速度&#xff0c;中…