一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情。
🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。🍊支持作者: 点赞👍、关注💖、留言💌~
大聪明在写代码的过程中发现设计模式的影子是无处不在,设计模式也是软件开发人员在软件开发过程中面临的一般问题的解决方案。大聪明本着“独乐乐不如众乐乐”的宗旨与大家分享一下设计模式的学习心得。
在讲责任链模式之前,我们先来看一下它的定义👇
责任链模式(Chain of Responsibility Pattern),顾名思义,它为请求创建了一个接收者对象的链。为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链,当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。(责任链模式也叫职责链模式)
通俗点来说,它为了保证让多个对象都有可能接收请求,于是就将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止,同时实现了请求发送者与请求接收者直接的解耦。(请求发送者只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,请求会自动进行传递,即实现了二者之间的解耦)
这就有点像一句俗话 —— “大懒支小懒”,包工头接到了一份搬砖的工作,于是就把工作分配给了大懒,大懒想:搬砖这么累,我才不干呢,给下面的人分配去,总会有人干的😎!于是就将任务分配给小懒;小懒如果也不想干的话,就将任务继续分配给小小懒... 直到任务分配给了小小小...小懒,他才尽心尽力的搬完了砖(心疼他三秒钟🙁),也就让包工头赚到了钱。在这个例子中,搬砖的工作就是请求;包工头就是请求的发送者;大懒 → 小懒 → ... → 小小小...小懒为请求接受者链,这就是一个很形象的责任链模式的体现✌。
🍋 说实话,我总感觉责任链模式的本质和递归的本质有点相似,有兴趣的小伙伴可以移步至大聪明教你学Java | 深入浅出聊递归(以汉诺塔为例)
通过上面的例子,我们可以总结出来责任链模式中的三个角色:
🍋责任链模式实现背景: 我们在开发应用系统的过程中,经常会遇到记录日志的需求。日志分为三种类型,分别是INFO(消息)、DEBUG(调试) 、ERROR(报错),当需要记录日志的时候,通过判断看看日志属于哪种类型, 然后对应的日志处理类再去处理相应的日志信息。
🍎🍎创建抽象的日志记录器类🍎🍎
/**
* 抽象的日志记录器类
* @description: AbstractLogger
* @author: 庄霸.liziye
* @create: 2022-04-16 07:29
**/
public abstract class AbstractLogger {
public static int INFO = 1;
public static int DEBUG = 2;
public static int ERROR = 3;
protected int level;
/**
* 责任链中的下一个元素
*/
protected AbstractLogger nextLogger;
public void setNextLogger(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);
}
复制代码
🍎🍎创建扩展了该记录器类的实体类🍎🍎
/**
* 创建扩展了该记录器类的实体类
* @description: InfoLogger
* @author: 庄霸.liziye
* @create: 2022-04-16 07:38
**/
class InfoLogger extends AbstractLogger {
public InfoLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Info Logger:" + message);
}
}
class DeBugLogger extends AbstractLogger {
public DeBugLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("DeBug Logger:" + message);
}
}
class ErrorLogger extends AbstractLogger {
public ErrorLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Error Logger:" + message);
}
}
复制代码
🍎🍎创建不同类型的记录器🍎🍎
/**
* @description: Test
* @author: 庄霸.liziye
* @create: 2022-04-16 07:51
**/
public class Test {
private static AbstractLogger getChainOfLoggers(){
AbstractLogger infoLogger = new InfoLogger(AbstractLogger.INFO);
AbstractLogger deBugLogger = new DeBugLogger(AbstractLogger.DEBUG);
AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
infoLogger.setNextLogger(deBugLogger);
deBugLogger.setNextLogger(errorLogger);
return infoLogger;
}
public static void main(String[] args) {
AbstractLogger loggerChain = getChainOfLoggers();
loggerChain.logMessage(AbstractLogger.INFO, "这是普通日志信息");
loggerChain.logMessage(AbstractLogger.DEBUG,"这是调试日志信息");
loggerChain.logMessage(AbstractLogger.ERROR,"这是错误日志信息");
}
}
复制代码
🍎🍎代码执行结果🍎🍎
最后我们总结一下责任链模式的优点与缺点👇
🍌🍌优点🍌🍌
🍋 优点一:降低耦合度。它将请求的发送者和接收者解耦。🍋 优点二:简化了对象。使得对象不需要知道链的结构。
🍋 优点三:增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
🍋 优点四:增加新的请求处理类很方便。
🍋 优点五:实现了责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。
🍌🍌缺点🍌🍌
🥝 缺点一:不能保证每个请求一定被处理。由于一个请求没有明确的接收者,所以不能保证它一定会被处理,该请求可能一直传到链的末端都得不到处理。🥝 缺点二:对比较长的职责链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响。
🥝 缺点三:职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会由于职责链的错误设置而导致系统出错,如可能会造成循环调用。
🥝 缺点四:可能不容易观察运行时的特征,给排查错误增加了难度。
本人经验有限,有些地方可能讲的没有特别到位,如果您在阅读的时候想到了什么问题,欢迎在评论区留言,我们后续再一一探讨🙇
希望各位小伙伴动动自己可爱的小手,来一波点赞+关注 (✿◡‿◡) 让更多小伙伴看到这篇文章~ 蟹蟹呦(●'◡'●)
如果文章中有错误,欢迎大家留言指正;若您有更好、更独到的理解,欢迎您在留言区留下您的宝贵想法。
爱你所爱 行你所行 听从你心 无问东西
原网址: 访问
创建于: 2023-06-12 11:58:09
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论