专栏首页我就是马云飞设计模式二十四章经之责任链模式

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

概述

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

使用场景

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

具体实现

众所周知,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),作者:Silence

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JVM暴力突破之JMM内存模型

    JMM规定了内存主要划分为主内存和工作内存两种。此处的主内存和工作内存跟JVM内存划分(堆、栈、方法区)是在不同的层次上进行的,如果非要对应起来,主内存对应的是...

    我就是马云飞
  • JJEvent 一个可靠的Android端数据埋点SDK

    注:代码已经经过线上项目验证, 横向Google统计对比,统计数据无丢失,性能稳定.

    我就是马云飞
  • 找工作时,我们应该思考的几件事情。

    现在身为跳槽高峰季,作为即将跳槽的我,在这里分享几点建议给大家。 简历怎么投? 众所周知,找工作的前提是面试,面试的前提是过了简历,过了简历的前提是你怎么投。这...

    我就是马云飞
  • 大开眼界:Facebook做了一个会“开眼”的AI,拯救眨眼照片

    想象一下,当你带着貌若天仙的女友在海边,她穿着飘逸的波西米亚大摆长裙,海风吹着裙子飞舞,蓦然回首的一刻,露出新垣结衣般的笑容。

    量子位
  • SAP MM模块常用的标准报表

    选择参数:常用的为未清收货WE103,选择那些还没有完全收货的采购订单;未清发票RECHNUNG,选择那些还没有开完发票的订单。一般情况下,不进行选择。

    用户5495712
  • k8s网络开发丨k8s与OpenStack网络如何打通?

    点击上方“腾讯云TStack”关注我们 获取最in云端资讯和海量技术干货 ? ? 本文作者 / ice yao 喜欢看动漫的IT男 还是火影迷、海贼迷、死神...

    腾讯云TStack
  • 谷歌的AI相册“事故”:它把我的三张照片拟合成了一张恐怖片

    大数据文摘
  • 告别三级火箭后,搜狗再创AI驱动的双引擎模式

    现代火箭动力一般采用三级推进模式,被称为三级火箭,其目的是增加火箭动力以摆脱地球引力。

    罗超频道
  • 修改 support 包 TabLayout,实现新浪微博/即刻 APP 蚯蚓导航效果

    修改 support 包 TabLayout,实现新浪微博/即刻 APP 蚯蚓导航效果。

    蜻蜓队长
  • 图像增强︱window7+opencv3.2+keras/theano简单应用(函数解读)

    在服务器上安装opencv遇到跟CUDA8.0不适配的问题,于是不得不看看其他机器是否可以预装并使用。 . 一、python+opencv3.2安装 ope...

    素质

扫码关注云+社区

领取腾讯云代金券