原文:http://www.runoob.com/design-pattern/
少许个人理解,如有错误请指出。欢迎一起讨论。

责任链模式
顾名思义,责任链模式(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、可动态指定一组对象处理请求。

代码实现:
我们创建抽象类 AbstractLogger,带有详细的日志记录级别。然后我们创建三种类型的记录器,都扩展了 AbstractLogger。每个记录器消息的级别是否属于自己的级别,如果是则相应地打印出来,否则将不打印并把消息传给下一个记录器。

责任链模式的 UML 图

步骤 1
创建抽象的记录器类。
AbstractLogger.java

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

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

ErrorLogger.java

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

FileLogger.java

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

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.");System.out.println();loggerChain.logMessage(AbstractLogger.DEBUG,"This is an debug level information.");System.out.println();loggerChain.logMessage(AbstractLogger.ERROR,"This is an error information.");}
}

步骤 4
验证输出。

Console::Logger: This is an information.File::Logger: This is an debug level information.Error::Logger: This is an error information.

注意:上述例子在AbstractLogger的logMessage修改了,因此输出与原版不同,请留意。

设计模式笔记十四:责任链模式相关推荐

  1. 行为型设计模式(1)—— 责任链模式(Chain of Responsibility Pattern)

    文章目录 1.简介 2.使用场景 3.示例 4.变种 参考文献 1.简介 经常听身边的同事说其在项目中用到了责任链模式,今天就来学习一下什么是责任链模式. 责任链模式(Chain of Respons ...

  2. java责任链模式做优惠_Java设计模式菜鸟系列(十八)责任链模式建模与实现

    责任链模式(ChainOfResponsibility): 有多个对象,每个对象持有下一个对象的引用,形成一条链,请求在这条链上传递,直到某一对象决定处理该请求,但是发出者并不清楚最终哪个对象会处理该 ...

  3. Java设计模式(九)责任链模式 命令模式

    (十七)责任链模式 责任链模式的目的是通过给予多个对象处理请求的机会,已解除请求发送者与接受者之间的耦合关系.面对对象的开发力求对象之前保持松散耦合,确保对象各自的责任最小化.这种设计能够使得系统更加 ...

  4. Android设计模式详解之责任链模式

    前言 责任链模式是行为型设计模式: 定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 使用场景: 多 ...

  5. 设计模式第七讲-责任链模式

    简介 责任链模式的定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. 图例 责任链-根据事情大小来决 ...

  6. 设计模式(五)责任链模式

    一.什么是责任链模式?     责任链就是从一个起点发起请求,然后沿着任务链依次传递给每一个节点上的对象,直到有一个节点处理这个请求为止. 二.责任链模式实例实现? 1 public abstract ...

  7. 设计模式中的车轮战-责任链模式

    责任链模式在Android中的应用莫过于事件分发了,ViewGroup对事件分别给子View,从ViewTree的顶部至上而下地进行处理,直到事件被消化为止,这种方法在Android广播中也能看到 责 ...

  8. 设计模式(三)- 责任链模式

    职责链模式 文章目录 职责链模式 1.职责链模式 1.介绍 2.应用实例 代码 1.员工提交请求类:LeaveRequest 2. 抽象请假处理类:AbstractLeaveHandler 3.直接主 ...

  9. 设计模式笔记十五:命令模式

    原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论. 命令模式(Command Pattern) 是一种数据驱动的设计模式,它 ...

最新文章

  1. linux 线程库在哪里,linux线程库
  2. 编写字符串反转函数 - 小小外星人的技术博客 - 博客频道 - CSDN.NET
  3. ant+svn+tomcat实现项目自动部署
  4. 设置同一Label内涵不同颜色字体
  5. 获取3的倍数_获取和设置pdf目录
  6. oracle备份归档文件,oracle 如何不备份已经备份的归档
  7. Linux驱动(6)--关于uboot
  8. 笑傲江湖手3D游服务器端文件,武林大会即将拉开序幕《笑傲江湖3D手游》12月公测来袭...
  9. vscode regex previewer插件怎么用_分享五款开挂神器!助你效率倍增!做PPT怎么能不会用插件?...
  10. c语言字符全排列数组,使用c语言递归实现字符串的全排列
  11. linux 创建文件夹快捷方式
  12. 京东金融移动安全体系
  13. Spring源码-context:component-scan的解析过程
  14. 倩女幽魂7月20日服务器维护,倩女幽魂手游2021年7月22日更新公告
  15. u盘被隐藏的文件怎么恢复
  16. perl和bugzilla
  17. 2015级计算机科学与技术2班班级博客大全
  18. 基础(四)之java后端根据经纬度获取地址
  19. SQL-Server 零基础入门教程[下]
  20. Buty Adidas Alphabounce Engineered Polska uwolnienie

热门文章

  1. linux ubuntu软件中心,安装Lubuntu 软件中心
  2. 演练:调试 Windows 窗体
  3. 201521123032 《Java程序设计》第8周学习总结
  4. springmvc-interceptor(拦截器)
  5. C++复数运算 重载
  6. 一个字符串排列的小算法
  7. chrome扩展之4(终结篇):一步步跟我学开发一个表单填写扩展
  8. leetcode 203 python3
  9. lazada铺货模式的选品_Lazada的商业模式有哪些?要怎么做?
  10. CCF201809-2 买菜