鍍金池/ 教程/ Java/ Java責(zé)任鏈模式
Java前端控制器模式
Java工廠設(shè)計(jì)模式
Java抽象工廠模式
Java觀察者模式
Java門面模式(或外觀模式)
Java備忘錄模式
Java MVC模式
Java單例模式
Java傳輸對(duì)象模式
Java迭代器模式
Java責(zé)任鏈模式
Java命令模式
Java原型模式
Java解釋器模式
Java適配器模式
Java狀態(tài)模式
Java中介者模式(Mediator Pattern)
Java攔截過濾器模式
Java策略模式
Java組合模式
Java業(yè)務(wù)代理模式
Java裝飾模式
Java模板模式
Java橋接模式
Java過濾器模式(條件模式)
Java享元模式(Flyweight Pattern)
Java建造者(Builder)模式
Java設(shè)計(jì)模式
Java空對(duì)象模式
Java數(shù)據(jù)訪問對(duì)象模式
Java訪問者模式
Java組合實(shí)體模式
Java服務(wù)定位器模式

Java責(zé)任鏈模式

顧名思義,責(zé)任模式鏈為請(qǐng)求創(chuàng)建一系列接收者對(duì)象。 此模式基于請(qǐng)求的類型將請(qǐng)求的發(fā)送方和接收方分離。 這種模式是行為模式。

在這種模式中,通常每個(gè)接收器包含對(duì)另一個(gè)接收器的引用。如果一個(gè)對(duì)象不能處理請(qǐng)求,則它將相同的對(duì)象傳遞給下一個(gè)接收者等等。

實(shí)現(xiàn)實(shí)例

在這個(gè)示例中,創(chuàng)建了一個(gè)具有日志級(jí)別的抽象類AbstractLogger。 然后創(chuàng)建了三種類型的擴(kuò)展AbstractLogger的日志記錄器。 每個(gè)記錄器檢查消息的級(jí)別到其級(jí)別并相應(yīng)地打印消息,否則不打印并將消息傳遞到其下一個(gè)記錄器。

責(zé)任鏈模式的實(shí)現(xiàn)實(shí)例結(jié)構(gòu)如下圖中所示 -

第1步

創(chuàng)建一個(gè)抽象記錄器類。如下代碼所示 -

AbstractLogger.java

public abstract class AbstractLogger {
   public static int INFO = 1;
   public static int DEBUG = 2;
   public static int ERROR = 3;

   protected int level;

   //next element in chain or responsibility
   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步

創(chuàng)建幾個(gè)擴(kuò)展記錄器的具體類。
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步

創(chuàng)建不同類型的記錄器。 為它們分配錯(cuò)誤級(jí)別,并在每個(gè)記錄器中設(shè)置下一個(gè)記錄器。 每個(gè)記錄器中的下一個(gè)記錄器表示鏈的一部分。

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步

驗(yàn)證輸出,執(zhí)行上面的代碼得到以下結(jié)果 -

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.