Java责任链模式
责任链模式
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
介绍
意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。
何时使用:在处理消息的时候以过滤很多道。
如何解决:拦截的类都实现统一接口。
关键代码:Handler 里面聚合它自己,在 HanleRequest 里判断是否合适,如果没达到条件则向下传递,向谁传递之前 set 进去。
应用实例: 1、红楼梦中的"击鼓传花"。 2、JS 中的事件冒泡。 3、JAVA WEB 中 Apache Tomcat 对 Encoding 的处理,Struts2 的拦截器,jsp servlet 的 Filter。
优点: 1、降低耦合度。它将请求的发送者和接收者解耦。 2、简化了对象。使得对象不需要知道链的结构。 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。 4、增加新的请求处理类很方便。
缺点: 1、不能保证请求一定被接收。 2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。 3、可能不容易观察运行时的特征,有碍于除错。
使用场景: 1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。 2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。 3、可动态指定一组对象处理请求。
注意事项:在 JAVA WEB 中遇到很多应用。
实现
我们创建抽象类 AbstractLogger,带有详细的日志记录级别。然后我们创建三种类型的记录器,都扩展了 AbstractLogger。每个记录器消息的级别是否属于自己的级别,如果是则相应地打印出来,否则将不打印并把消息传给下一个记录器。
步骤 1
创建抽象的记录器类。
AbstractLogger.java
- public abstract class AbstractLogger {
- public static int INFO = ;
- public static int DEBUG = ;
- public static int ERROR = ;
- 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
- public class ConsoleLogger extends AbstractLogger {
- public ConsoleLogger(int level){
- this.level = level;
- }
- @Override
- protected void write(String message) {
- System.out.println("Standard Console::Logger: " + message);
- }
- }
ErrorLogger.java
- public class ErrorLogger extends AbstractLogger {
- public ErrorLogger(int level){
- this.level = level;
- }
- @Override
- protected void write(String message) {
- System.out.println("Error Console::Logger: " + message);
- }
- }
FileLogger.java
- public class FileLogger extends AbstractLogger {
- public FileLogger(int level){
- this.level = level;
- }
- @Override
- protected void write(String message) {
- System.out.println("File::Logger: " + message);
- }
- }
步骤 3
创建不同类型的记录器。赋予它们不同的错误级别,并在每个记录器中设置下一个记录器。每个记录器中的下一个记录器代表的是链的一部分。
ChainPatternDemo.java
- 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.");
- }
- }
步骤 4
执行程序,输出结果:
- 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.
Java责任链模式的更多相关文章
- java责任链模式及项目实际运用
1.前言 上次我们认识了java责任链模式的设计,那么接下来将给大家展示责任链模式项目中的实际运用.如何快速搭建责任链模式的项目中运用. 2.简单技术准备 我们要在项目中使用借助这样的几个知识的组合运 ...
- java 责任链模式的三种实现
责任链模式 责任链模式的定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系, 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止.这里就不再过多的介绍什么 ...
- 重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 场地和场景的重要性 射击
- 浅谈Java五大设计原则之责任链模式
首先我们得先定义一个责任链模式: 责任链模式是一种线性执行流程,多个对象都有机会去执行同一个任务,只是在执行过程中, 由于执行的权利和范围不一样,那么当自己不能处理此任务时,就必须将这个任务抛给下一个 ...
- JAVA设计模式之责任链模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- Java设计模式系列之责任链模式
责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道 ...
- 详解java设计模式之责任链模式
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt175 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次 ...
- 我的Java设计模式-责任链模式
今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯 ...
- Java进阶篇设计模式之八 ----- 责任链模式和命令模式
前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command ...
随机推荐
- CSS content应用
一.简介 content属性早在 CSS2.1的时候就被引入了,可以使用:before以及:after伪元素生成内容.此特性目前已被大部分的浏览器支持:(Firefox 1.5+, Safari 3. ...
- ASP.NET 常用的字符串加密
字符串常用的加密有三种 1.MD5加密,这个常用于密码,单向加密,不可解密,有些在线解密的可以解大部份,用代码不能实现,如果不想让人解密,加密后随便截取一段就好了: 2.Base64位加密,通常加密后 ...
- C++并发多线程(一)
并发:两个或者更多的任务同时发生,一个程序同时执行多个独立的任务. 以往计算机 单核CPU 某一个时刻只能执行一个任务 由操作系统调度 每秒钟进行多次所谓的任务切换并发的假象(不是真正的并发),这种切 ...
- ASP.NET 页面执行顺序详解
今天整理了一下ASP执行过程,从.net页码的执行周期开始做一个详细的了解.我重写了页面的绝大多数方法.然后加载执行.所得的顺序如下. 方法是每个重写的事件中都输出一个字符,按字符打印出来的先后判断事 ...
- DOM学习日记1
1.通过 id 查找 HTML 元素 var x=document.getElementById("intro"); 2.通过标签名查找 HTML 元素本例查找 id=" ...
- zTree第三章,异步加载,前端
zTree异步加载 ---------------------------------------------------------------------------------- 具体详见API ...
- 洛谷P1742 最小圆覆盖(计算几何)
题面 传送门 题解 之前只是在抄题解--这篇才算是真正自己想的吧-- 首先我们把输入序列给\(random\)一下防止出题人好心送你一个毒瘤序列 我们设\(r\)为当前最大半径,\(o\)为此时对应圆 ...
- 设置、读取、删除cookie
刚才用虚拟机当服务器,开了两个服务(端口号不同),发现同样的cookie:在别的网站下面没有发现该cookie.说明cookie只是对应相应的网站的(自己得出的结论) ---------------- ...
- linux下查找命令总结
查找命令总结,which,whereis,find,locate,type http://blog.csdn.net/jessica1201/article/details/8139249 1.f ...
- Linux和Windows数据同步
正在做一个小项目,关于Linux和Windows数据同步,新知识很兴奋,比赛很有信心,加油吧少年 项目进行中:今晚实验室包宿开整.