15-Java责任链模式 ( Chain of Responsibility)

Java责任链模式

    • 摘要
    • 实现
    • 范例

  • 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链

  • 责任链模式给予请求的类型,对请求的发送者和接收者进行解耦

  • 责任链模式中通常每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推

  • 责任链模式属于行为型模式

摘要

1. 意图

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

2. 主要解决

职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,
无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了

3. 何时使用

  • 在处理消息的时候以过滤很多道

4. 如何解决

拦截的类都实现统一接口

5. 关键代码

  • Handler 里面聚合它自己,在 HanleRequest 里判断是否合适,如果没达到条件则向下传递,向谁传递之前 set 进去

6. 应用实例

  • 红楼梦中的”击鼓传花”;
  • JS中的事件冒泡;
  • JAVAWEB中ApacheTomcat对Encoding的处理,Struts2的拦截器,jspservlet的Filter;

7. 优点

  • 降低耦合度它将请求的发送者和接收者解耦;
  • 简化了对象使得对象不需要知道链的结构;
  • 增强给对象指派职责的灵活性通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任;
  • 增加新的请求处理类很方便;

8. 缺点

  • 不能保证请求一定被接收;
  • 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用;
  • 可能不容易观察运行时的特征,有碍于除错;

9. 使用场景

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

10. 注意事项

  • 在JAVA WEB 中遇到很多应用

实现

在这里插入图片描述

  1. 定义抽象类AbstractLogger,带有详细的日志记录级别;
  2. 定义三种类型的记录器,都扩展了AbstractLogger;

每个记录器消息的级别判断是否属于自己的级别,如果是则相应地打印出来,否则将不打印并把消息传给下一个记录器

范例

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

AbstractLogger.java

package com.demo.gof;
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);}

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

ConsoleLogger.java

package com.demo.gof;
public class ConsoleLogger extends AbstractLogger {public ConsoleLogger(int level){this.level = level;}@Overrideprotected void write(String message) {       System.out.println("Standard Console::Logger: " + message);}
}

ErrorLogger.java

package com.demo.gof;
public class ErrorLogger extends AbstractLogger {public ErrorLogger(int level){this.level = level;}@Overrideprotected void write(String message) {       System.out.println("Error Console::Logger: " + message);}
}

FileLogger.java

package com.demo.gof;
public class FileLogger extends AbstractLogger {public FileLogger(int level){this.level = level;}@Overrideprotected void write(String message) {       System.out.println("File::Logger: " + message);}
}

3. 创建不同类型的记录器

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

ChainPatternDemo.java

package com.demo.gof;
public class ChainPatternDemo {private static AbstractLogger getChainOfLoggers(){AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);errorLogger.setNextLogger(fileLogger);fileLogger.setNextLogger(consoleLogger);return errorLogger;   }public static void main(String[] args) {AbstractLogger loggerChain = getChainOfLoggers();loggerChain.logMessage(AbstractLogger.INFO, "This is an information.");loggerChain.logMessage(AbstractLogger.DEBUG, "This is an debug level information.");loggerChain.logMessage(AbstractLogger.ERROR, "This is an error information.");}
}

编译运行以上 Java 范例,输出结果如下

$ javac -d . src/main/com.demo/gof/ChainPatternDemo.java
$ java  com.demo.gof.ChainPatternDemo
Standard Console::Logger: This is an information.
File::Logger: This is an debug level information.
Standard Console::Logger: This is an debug level information.
Error Console::Logger: This is an error information.
File::Logger: This is an error information.
Standard Console::Logger: This is an error information.

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

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

相关文章

Linux MBR扇区故障 引导修复

CSDN 成就一亿技术人&#xff01; 作者主页&#xff1a;点击&#xff01; Linux专栏&#xff1a;点击&#xff01; CSDN 成就一亿技术人 前言———— Linux MBR&#xff08;Master Boot Record&#xff0c;主引导记录&#xff09;是硬盘的第一个扇区&#xff0c;通常位于磁…

使用C++界面框架ImGUI开发一个简单程序

简介 ImGui 是一个用于C的用户界面库&#xff0c;跨平台、无依赖&#xff0c;支持OpenGL、DirectX等多种渲染API&#xff0c;是一种即时UI&#xff08;Immediate Mode User Interface&#xff09;库&#xff0c;保留模式与即时模式的区别参考保留模式与即时模式。ImGui渲染非常…

DevOps学习 | 如何应对IT服务交付中的问题?

目录 前言 DevOps是什么&#xff1f; DevOps发展历程 DevOps与微服务、容器的关系 书本推荐 前言 作为一个热门的概念&#xff0c;DevOps这个名词在程序员社区里频频出现&#xff0c;备受技术大佬们的追捧。甚至网络上有了“南无DevOps”的戏言&#xff08;南无在梵语的意…

Python采集学习笔记-request的get请求和post请求

使用http://httpbin.org测试,一个简单的 HTTP 请求和响应服务。(需联网)1.导入requests包 import requests 2.测试get请求 url http://httpbin.org/get par {key1: value1, key2: value2} # 不带参数请求 r1 requests.get(url) # 带参数请求 r2 requests.get(url, paramspa…

Mybatisplus 实体类属性名带有下划线映射问题

对于带下划线的的字段&#xff0c;根据驼峰命名规则&#xff0c;下划线后的字母大写 像这样 但是对于下划线后面带数字的&#xff0c;数字没有大小写&#xff0c;先这样写看看 然而报错 下划线不去掉试试 虽然不报错了&#xff0c;可是sl_2的值不对 dbjrdmxList.forEach(u-…

内网穿透实现方案(免费版)

目录 一、内网地址与内网端口二、花生壳三、natapp 一、内网地址与内网端口 一般本地项目启动后&#xff0c;在浏览器输入localhost:项目端口号或者127.0.0.1:项目端口号。这里我们在工具中输入的内网地址是项目运行本地的ip&#xff0c;内网端口就是项目端口号。 本地ip查询方…

【C语言】剖析qsort函数的实现原理

主页&#xff1a;17_Kevin-CSDN博客 专栏&#xff1a;《C语言》 本文将从回调函数&#xff0c;qsort函数的应用&#xff0c;qsort函数的实现原理三个方面进行讲解&#xff0c;请自行跳转至相对位置进行阅读~ 目录 回调函数 qsort函数的应用 qsort函数实现原理 回调函数 什…

6、JavaWeb-Mybatis

P116 Mybatis-入门 Mybatis是一款优秀的持久层框架&#xff0c;用于简化JDBC的开发。 持久层就是三层控制中的Dao层&#xff0c;数据访问层/持久层&#xff0c; P117 Mybatis-入门-快速入门程序 步骤&#xff1a; 创建springboot工程&#xff0c;数据表和实体类 引入mybat…

【力扣 - 盛最多水的容器】

题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容…

深入理解MySQL事务:保证数据的一致性和可靠性

摘要&#xff1a;MySQL事务是一种重要的数据库管理技术&#xff0c;能够确保数据的一致性和可靠性。本文将深入探讨MySQL事务的概念、特性、隔离级别以及如何正确使用事务来处理并发访问和保护数据的问题。 一. 什么是MySQL事务&#xff1f; MySQL事务是一系列对数据库进行读写…

AI蠕虫病毒威胁升级,揭示AI安全新危机

一组研究人员成功研发出首个能够通过电子邮件客户端窃取数据、传播恶意软件以及向他人发送垃圾邮件的AI蠕虫&#xff0c;并在使用流行的大规模语言模型&#xff08;LLMs&#xff09;的测试环境中展示了其按设计功能运作的能力。基于他们的研究成果&#xff0c;研究人员向生成式…

Aigtek电压放大器选购注意事项及要求有哪些

电压放大器是电子设备中常用的一种放大器&#xff0c;广泛应用于各种电子设备和通信系统中。选购电压放大器时&#xff0c;需要考虑一些重要的注意事项和要求。下面安泰电子将为大家介绍选购电压放大器时需要注意的一些事项和要求&#xff0c;帮助您在购买过程中作出明智的决策…