前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式二十四章经之责任链模式

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

作者头像
我就是马云飞
发布2018-06-22 17:39:43
4930
发布2018-06-22 17:39:43
举报
文章被收录于专栏:我就是马云飞

概述

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

使用场景

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

具体实现

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

代码语言:javascript
复制
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个类代表三个等级去实现这个这个抽象类。

代码语言:javascript
复制
public class InfoLogger extends AbstractLogger {
   public InfoLogger(int level){
      this.level = level;
   }
   @Override
   protected void write(String message) {        
      System.out.println("InfoLogger: " + message);
   }
}
代码语言:javascript
复制
public class ErrorLogger extends AbstractLogger {
   public ErrorLogger(int level){
      this.level = level;
   }
   @Override
   protected void write(String message) {        
      System.out.println("ErrorLogger: " + message);
   }
}
代码语言:javascript
复制
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中我们分别指出每个类的下一级是什么。

代码语言:javascript
复制
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.");
   }
}

输出结果如下:

代码语言:javascript
复制
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.

总结

优点:

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

缺点:

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我就是马云飞 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 使用场景
  • 具体实现
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档