设计模式二十四章经之责任链模式

概述

责任链模式,顾名思义,它是一个链式模型,这种模式给予请求的类型,对请求的发送者和接收者进行解耦。对于这种结构,每个节点可以拆分在链接,所以,这种模式有着较好的灵活性。

使用场景

  • 多个对象处理同一个请求
  • 在请求处理者不明确的情况下向多个对象中的一个提交一个请求。
  • 需要动态指定一组对象处理请求。

具体实现

众所周知,Android中最常见的责任链模式。现在我们来实现一个简单的责任链模式。 我们写一个抽象类来指定所有的等级划分。

public abstract class AbstractLogger {
   public static final int INFO = 1;
   public static final int DEBUG = 2;
   public static final 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);
}

现在我们分别创建3个类代表三个等级去实现这个这个抽象类。

public class InfoLogger extends AbstractLogger {
   public InfoLogger(int level){
      this.level = level;
   }
   @Override
   protected void write(String message) {        
      System.out.println("InfoLogger: " + message);
   }
}
public class ErrorLogger extends AbstractLogger {
   public ErrorLogger(int level){
      this.level = level;
   }
   @Override
   protected void write(String message) {        
      System.out.println("ErrorLogger: " + message);
   }
}
public class DebugLogger extends AbstractLogger {
   public DebugLogger(int level){
      this.level = level;
   }
   @Override
   protected void write(String message) {        
      System.out.println("DebugLogger: " + message);
   }
}

现在我们创建一个Demo,在Demo中我们分别指出每个类的下一级是什么。

public class ChainPatternDemo {
   private static AbstractLogger getChainOfLoggers(){
      AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
      AbstractLogger debugLogger = new DebugLogger(AbstractLogger.DEBUG);
      AbstractLogger infoLogger = new InfoLogger(AbstractLogger.INFO);
      errorLogger.setNextLogger(debugLogger);
      debugLogger.setNextLogger(infoLogger);
      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.");
   }
}

输出结果如下:

InfoLogger: This is an information.
DebugLogger: This is an debug level information.
InfoLogger: This is an debug level information.
ErrorLogger: This is an error information.
DebugLogger: This is an error information.
InfoLogger: This is an error information.

总结

优点:

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

缺点:

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

原文发布于微信公众号 - 我就是马云飞(coding_ma)

原文发表时间:2018-06-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术碎碎念

Jsp语法、指令及动作元素

一、JSP的语法 1、JSP的模板元素:(先写HTML)    就是JSP中的那些HTML标记    作用:页面布局和美化 2、JSP的Java脚本表达式:  ...

3636
来自专栏Seebug漏洞平台

Jenkins 未授权远程代码执行漏洞(CVE-2017-1000353)

漏洞概要 Jenkins 未授权远程代码执行漏洞, 允许攻击者将序列化的Java SignedObject对象传输给Jenkins CLI处理,反序列化Obj...

3776
来自专栏决胜机器学习

PHP PDO——单例模式实现数据库操作

PHP PDO——单例模式实现数据库操作 (原创内容,转载请注明来源,谢谢) 一、概述 PDO是PHP访问数据库的轻量、持久的接口,其提供一个...

6118
来自专栏喵了个咪的博客空间

zephir-(2)安装和初体验

zephir-安装和初体验 ? 前言 先在这里感谢各位zephir开源技术提供者 zephir主要是解决了PHP开发人员尝试编写和编译PHP拓展所能执行的代码的...

3756
来自专栏Java Edge

Bean Validation 介绍及最佳实践关于 Bean ValidationBean Validation 中的 constraint创建一个包含验证逻辑的简单应用(基于 JSP)定制化的 co

2877
来自专栏王磊的博客

Spring Boot(十二)单元测试JUnit

JUnit是一款优秀的开源Java单元测试框架,也是目前使用率最高最流行的测试框架,开发工具Eclipse和IDEA对JUnit都有很好的支持,JUnit主要用...

362
来自专栏xdecode

Spring之IOC

IOC 控制反转, 将由程序直接操控的对象调用权交给容器, 通过容器来实现对象的装配和管理. 容器即applicationContext.xml 第一个spri...

1757
来自专栏JackieZheng

照虎画猫写自己的Spring——依赖注入

前言 上篇《照虎画猫写自己的Spring》从无到有讲述并实现了下面几点 声明配置文件,用于声明需要加载使用的类 加载配置文件,读取配置文件 解析配置文件,需要将...

1928
来自专栏大内老A

我所理解的Remoting(3):创建CAO Service Factory使接口和实现相互分离

我们知道对于Remoting,有两种不同的Activation模式:Server Activation和Client Activation。他我在前面的系列文章...

1856
来自专栏北京马哥教育

快收藏! 30 分钟包你学会 AWK

本文大部分内容翻译自我开始学习AWK时看到的一篇英文文章 AWK Tutorial ,觉得对AWK入门非常有帮助,所以对其进行了粗略的翻译,并对其中部分内容进行...

3047

扫码关注云+社区