浅谈JAVA 责任链模式

顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

介绍

意图:

避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

主要解决:

职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

何时使用:

在处理消息的时候以过滤很多道。

如何解决:

拦截的类都实现统一接口。

关键代码:

Handler 里面聚合它自己,在 HandlerRequest 里判断是否合适,如果没达到条件则向下传递,向谁传递之前 set 进去。

应用实例:

1、红楼梦中的"击鼓传花"。

2、JS 中的事件冒泡。

3、JAVA WEB 中 Apache Tomcat 对 Encoding 的处理,Struts2 的拦截器,jsp servlet 的 Filter。

优点:

1、降低耦合度。它将请求的发送者和接收者解耦。

2、简化了对象。使得对象不需要知道链的结构。

3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。

4、增加新的请求处理类很方便。

缺点:

1、不能保证请求一定被接收。

2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。

3、可能不容易观察运行时的特征,有碍于除错。

使用场景:

1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。

2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

3、可动态指定一组对象处理请求。

注意事项:

在 JAVA WEB 中遇到很多应用。

实现

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

步骤 1

创建抽象的记录器类。

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

创建扩展了该记录器类的实体类。

public class ConsoleLogger extends AbstractLogger {

  public ConsoleLogger(int level){
   this.level = level;
  }

  @Override
  protected void write(String message) {
   System.out.println("Standard Console::Logger: " + message);
  }
}
public class ErrorLogger extends AbstractLogger {

  public ErrorLogger(int level){
   this.level = level;
  }

  @Override
  protected void write(String message) {
   System.out.println("Error Console::Logger: " + message);
  }
}
public class FileLogger extends AbstractLogger {

  public FileLogger(int level){
   this.level = level;
  }

  @Override
  protected void write(String message) {
   System.out.println("File::Logger: " + message);
  }
}

步骤 3

创建不同类型的记录器。赋予它们不同的错误级别,并在每个记录器中设置下一个记录器。每个记录器中的下一个记录器代表的是链的一部分。

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.");

   loggerChain.logMessage(AbstractLogger.DEBUG,
     "This is a debug level information.");

   loggerChain.logMessage(AbstractLogger.ERROR,
     "This is an error information.");
  }
}

步骤 4

执行程序,输出结果:

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

以上就是浅谈JAVA 责任链模式的详细内容,更多关于JAVA 责任链模式的资料请关注我们其它相关文章!

(0)

相关推荐

  • 设计模式之责任链模式_动力节点Java学院整理

    定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 类型:行为类模式 类图: 首先来看一段代码: public void test(int i, Request request){ if(i==1){ Handler1.response(request); }else if(i == 2){ Handler2.response(request); }else if(i == 3){ Handler3

  • Java设计模式之责任链模式

    设计者往往会用拦截器去代替动态代理,然后将拦截器的接口提供给开发者,从而简化开发者的开发难度,但是拦截器可能有多个.举个例子,一个程序员需要请假一周,如果把请假申请单看成一个对象,那么它需要经过项目经理.部门经理.人事等多个角色的审批,每个角色都有机会通过拦截这个申请单进行审批或者修改.这事就要考虑提供项目经理.部门经理和人事的处理逻辑,所以需要提供3个拦截器,二传递的则是请假申请单. 当一个对象在一条链上被多个拦截器处理(拦截器也可以选择不拦截处理它)时,我们把这样的设计模式成为责任链模式,它

  • Java经典设计模式之责任链模式原理与用法详解

    本文实例讲述了Java经典设计模式之责任链模式.分享给大家供大家参考,具体如下: 责任链模式:多个对象由其对象对应下家的引用连成一条链,请求在这个链上传递,直到链上的某一个接收对象处理此请求.因为请求的客户端并不知道链上最终是谁来处理这个请求,使得系统可以在不影响客户端的情况下动态地重新组织和分配责任,从而避免了请求发送者与请求处理者之间的耦合. 责任链械中涉及到三种角色: 1,抽象处理者角色 2,具体处理者角色 3,请求发送者 小例子:假设去买房子,买房子就需要砍价, 卖房的人职位不同,可以优

  • Java 中责任链模式实现的三种方式

    责任链模式 责任链模式的定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系, 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止.这里就不再过多的介绍什么是责任链模式,主要来说说java中如何编写.主要从下面3个框架中的代码中介绍. servlet中的filter dubbo中的filter mybatis中的plugin 这3个框架在实现责任链方式不尽相同. servlet中的Filter servlet中分别定义了一个 Filter和Filter

  • 23种设计模式(19)java责任链模式

    23种设计模式第十九篇:java责任链模式 定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 类型:行为类模式 类图: 首先来看一段代码: public void test(int i, Request request){ if(i==1){ Handler1.response(request); }else if(i == 2){ Handler2.response(request); }els

  • Java责任链模式定义与用法分析

    本文实例讲述了Java责任链模式定义与用法.分享给大家供大家参考,具体如下: 使很多对象都有处理请求的机会,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止 责任链模式主要包括以下几个角色 1.处理者:处理者是一个接口,负责规定具体处理者处理用户请求的方法以及具体处理者设置后继处理对象的方法 2.具体处理者:具体处理者是实现处理接口的类的实例,具体处理者通过调用处理接口规定的方法处理用户的请求,既在接到用户的请求后,处理者将调用接

  • 轻松掌握java责任链模式

    定义:责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式.在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. 特点:1.降低耦合度.它将请求的发送者和接收者解耦. 2.简化了对象.使得对象不需要知道链的结构. 3.增强给对象指派职责的灵活性.通过改变链内的成员或者调动它们

  • Java使用责任链模式处理学生请假问题详解

    本文实例讲述了Java使用责任链模式处理学生请假问题.分享给大家供大家参考,具体如下: 一. 模式定义 在责任链模式中,很多对象由每一个对象对其下家的引用而连接起来,形成一条链.客户端应用请求在这个链上进行传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪个对象最终处理这个请求,这使系统可以在不影响客户端的情况下动态地重新组织链和分配责任. (1)抽象处理者角色:定义出一个处理请求的接口.如果需要,接口可以定义出一个方法,以设定和返回下家的引用.这个角色通常由一个Ja

  • Java责任链模式模板代码分享

    本文分享了一则Java编程责任链模式的模板代码,代码中有详细注释,大家可以参考.具体如下: //抽象处理者 public abstract class Handler{ private Handler nextHandler; //每个处理者都必须对请求做出处理 public final Response handleMessage(Request request){ Response response = null; //判断是否自己的处理级别 if(this.getHandlerLevel(

  • 浅谈JAVA 责任链模式

    顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式. 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. 介绍 意图: 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止. 主要解决

  • 浅谈Python 责任链模式

    目录 介绍 实现方式 案例 测试 使用场景 介绍 责任链模式是一种行为型设计模式,它允许多个对象以链式的形式依次处理请求,直到请求被处理或者无处理对象为止 实现方式 责任链模式由多个处理器组成,每个处理器都可以处理一种请求.如果当前处理器无法处理请求,它将把请求传递给下一个处理器,直到请求被处理或者没有处理器可以处理为止. 案例 假设我们正在开发一个电子商务平台,现在需要实现一个购物车功能.当用户添加商品到购物车中时,需要进行以下验证 商品是否存在 商品库存是否充足 商品是否已经下架 我们可以使

  • 浅谈java异常链与异常丢失

    1.在java的构造方法中提供了 异常链.. 也就是我们可以通过构造方法不断的将 异常串联成一个异常链... 之所以需要异常连,是因为处于代码的可理解性,以及阅读和程序的可维护性... 我们知道我们每抛出一个异常都需要进行try catch ...那么岂不是代码很臃肿... 我们如果可以将异常串联成一个异常连,然后我们只捕获我们的包装 异常,我们知道 RuntimeException 以及其派生类可以不进行try catch 而被jvm自动捕获并处理.. 当然了我们可以自己定义自己的异常类从Ru

  • Java设计模式之java责任链模式详解

    目录 概述 结构 总结 在本讲,我们来学习一下行为型模式里面的第四个设计模式,即责任链模式. 概述 在学习责任链模式之前,我们先来看一下下面这段描述. 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同.例如,公司员工请假,可批假的领导有部门负责人.副总经理.总经理等,但是每个领导能批准的天数不同,员工必须根据自己要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名.电话和地址等信息,这增加了员工请假的难度.因为领导有很多,员工到底找哪位

  • Java 设计模式之责任链模式及异步责任链详解

    目录 一.定义 二.普通责任链模式 三.异步责任链模式 一.定义 责任链模式(Chain of Responsibility Pattern):避免将一个请求的发送者与接受者耦合在一起,让多个对象都有机会处理请求.将接受请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止. 在很多源码都有涉及,如Mybatis拦截器.Filter- 责任链模式属于行为型模式. 二.普通责任链模式 抽象处理类:AbstractProcessor /** * 抽象处理类 */ public

  • Java实现设计模式之责任链模式

    目录 1.什么是责任链模式 2.如何实现 3.代码实现 4.总结 1.什么是责任链模式 当一个请求可能需要多个对象中的某个进行处理时,将这些对象连成一条链,并沿者这条链传递该请求,知道有一个对象处理它为止.这样的情况或需求时,可以采用责任链模式. 2.如何实现 1)处理者接口(Handler),负责定义处理请求的抽象方法,并设置下一个处理着的方法. 2)具体处理者,实现Handler接口中定义的方法.实现处理用户请求的逻辑,并设置下一个处理请求的对象.如果能够处理用户求情就处理,如果不能处理,交

随机推荐