职责链形式

望文生义,职责链形式(Chain of Responsibility Pattern)为恳求创立了一个接纳者目标的链。这种形式给予恳求的类型,对恳求的发送者和接纳者进行解耦。这种类型的规划形式归于行为型形式。

在这种形式中,一般每个接纳者都包括对另一个接纳者的引证。假如一个目标不能处理该恳求,那么它会把相同的恳求传给下一个接纳者,依此类推。

介绍

目的:防止恳求发送者与接纳者耦合在一起,让多个目标都有或许接纳恳求,将这些目标连接成一条链,并且沿着这条链传递恳求,直到有目标处理它停止。

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

何时运用:在处理音讯的时分以过滤许多道。

怎么处理:阻拦的类都完成一致接口。

要害代码:Handler 里边聚合它自己,在 HanleRequest 里判别是否适宜,假如没到达条件则向下传递,向谁传递之前 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。每个记载器音讯的等级是否归于自己的等级,假如是则相应地打印出来,不然将不打印并把音讯传给下一个记载器。

职责链形式的 UML 图

过程 1

创立笼统的记载器类。

AbstractLogger.java

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

创立扩展了该记载器类的实体类。

ConsoleLogger.java

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);
   }
}

ErrorLogger.java

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);
   }
}

FileLogger.java

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

创立不同类型的记载器。赋予它们不同的过错等级,并在每个记载器中设置下一个记载器。每个记载器中的下一个记载器代表的是链的一部分。

ChainPatternDemo.java

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 an debug level information.");

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

过程 4

验证输出。

Standard Console::Logger: This is an information.
File::Logger: This is an debug level information.
Standard Console::Logger: This is an 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.