经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
责任链模式(Chain Of Responsibility Pattern)
来源:cnblogs  作者:ZT1994  时间:2018/10/25 9:36:58  对本文有异议

责任链模式

一、什么是责任链模式?

??责任链模式(Chain Of Responsibility Pattern)为请求创建了一个接收者对象的链。对请求的发送者和接收者进行解耦,这种类型的设计模式属于行为者模式。
??责任链模式,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把请求传给下一个接收者,以此类推。

二、责任链模式的作用

??让请求发送者和接收者解耦。责任链上的处理者负责处理请求,客户只需要将请求发送到责任链上,无需关心请求的处理细节和请求的传递。
??JS 中的事件冒泡。JAVA WEB 中 Apache Tomcat 对 Encoding 的处理,Struts2 的拦截器,jsp servlet 的 Filter。 都使用了责任链模式。

三、责任链模式的优缺点

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

四、责任链具体代码实现

1、结构图

2、主要角色
  1. Handler 处理者:定义了处理请求的接口,handler知道,下一个处理者是谁,如果自己无法处理请求,就转给下一个处理者
  2. concreteHandler 具体处理者:具体的处理者是处理请求的具体角色
  3. Client 请求客户:请求者角色,就是向第一个具体的handler发送请求的角色,并连接好责任链
3、具体java代码

Handler 处理:

  1. package com.designpattern.chainOfResponsibilityPattern;
  2. /**
  3. * 抽象日志类
  4. * Handler 处理者
  5. * 定义了处理请求的接口,handler知道,下一个处理者是谁,如果自己无法处理请求,就转给下一个处理者。
  6. *
  7. * @author zhongtao on 2018/10/23
  8. */
  9. public abstract class AbstractLogger {
  10. public static int INFO = 1;
  11. public static int DEBUG = 2;
  12. public static int ERROR = 3;
  13. private int level;
  14. public AbstractLogger(int level) {
  15. this.level = level;
  16. }
  17. private AbstractLogger nextLogger;
  18. /**
  19. * 指定下一个处理者
  20. *
  21. * @param nextLogger
  22. */
  23. public void setNextLogger(AbstractLogger nextLogger) {
  24. this.nextLogger = nextLogger;
  25. }
  26. abstract public void write(String message);
  27. public void logMessage(int level, String message) {
  28. if (this.level == level) {
  29. write(message);
  30. }
  31. if (nextLogger != null) {
  32. nextLogger.logMessage(level, message);
  33. }
  34. }
  35. }

具体处理者:

  1. /**
  2. * 扩展了该记录器类的实体类
  3. * 具体责任处理者
  4. * @author zhongtao on 2018/10/23
  5. */
  6. public class ConsoleLogger extends AbstractLogger {
  7. public ConsoleLogger(int level) {
  8. super(level);
  9. }
  10. @Override
  11. public void write(String message) {
  12. System.out.println("Standard Console: logger->" + message);
  13. }
  14. }
  15. public class FileLogger extends AbstractLogger {
  16. public FileLogger(int level) {
  17. super(level);
  18. }
  19. @Override
  20. public void write(String message) {
  21. System.out.println("File : logger->" + message);
  22. }
  23. }
  24. public class ErrorLogger extends AbstractLogger {
  25. public ErrorLogger(int level) {
  26. super(level);
  27. }
  28. @Override
  29. public void write(String message) {
  30. System.out.println("Error Console: logger->" + message);
  31. }
  32. }

创建责任链:

  1. package com.designpattern.chainOfResponsibilityPattern;
  2. /**
  3. * 创建责任链
  4. *
  5. * @author zhongtao on 2018/10/23
  6. */
  7. public class ChainDemo {
  8. public static AbstractLogger getChainOfLoggers() {
  9. AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
  10. AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);
  11. AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);
  12. errorLogger.setNextLogger(fileLogger);
  13. fileLogger.setNextLogger(consoleLogger);
  14. return errorLogger;
  15. }
  16. }

测试责任链模式:

  1. package com.designpattern.chainOfResponsibilityPattern;
  2. import org.junit.Test;
  3. /**
  4. * 测试责任链模式
  5. *
  6. * @author zhongtao on 2018/10/23
  7. */
  8. public class ChainPatternTest {
  9. @Test
  10. public void testChainPattern() {
  11. AbstractLogger loggerChain = ChainDemo.getChainOfLoggers();
  12. loggerChain.logMessage(AbstractLogger.INFO, "This is an information");
  13. System.out.println();
  14. loggerChain.logMessage(AbstractLogger.DEBUG, "This is an debug level information");
  15. System.out.println();
  16. loggerChain.logMessage(AbstractLogger.ERROR, "This is an error information");
  17. }
  18. }

测试结果:

  1. Standard Console: logger->This is an information
  2. File : logger->This is an debug level information
  3. Error Console: logger->This is an error information

源码地址:https://github.com/zt19994/designPattern

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号