責任鏈模式

定義

顧名思義,責任鏈模式(Chain of Responsibility Pattern)為請求創(chuàng)建了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發(fā)送者和接收者進行解耦。這種類型的設(shè)計模式屬于行為型模式。
在這種模式中,通常每個接收者都包含對另一個接收者的引用。如果一個對象不能處理該請求,那么它會把相同的請求傳給下一個接收者,依此類推。

實現(xiàn)

我們創(chuàng)建抽象類 AbstractLogger,帶有詳細的日志記錄級別。然后我們創(chuàng)建三種類型的記錄器,都擴展了 AbstractLogger。每個記錄器消息的級別是否屬于自己的級別,如果是則相應(yīng)地打印出來,否則將不打印并把消息傳給下一個記錄器。

責任鏈模式的 UML 圖

步驟 1
創(chuàng)建抽象的記錄器類。
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
創(chuàng)建擴展了該記錄器類的實體類。
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)建不同類型的記錄器。賦予它們不同的錯誤級別,并在每個記錄器中設(shè)置下一個記錄器。每個記錄器中的下一個記錄器代表的是鏈的一部分。
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.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 責任鏈模式 顧名思義,責任鏈模式(Chain of Responsibility Pattern)為請求創(chuàng)建了一個...
    WILL_HUNTING閱讀 182評論 0 0
  • http://www.runoob.com/design-pattern/chain-of-responsibil...
    小陳阿飛閱讀 371評論 0 1
  • 顧名思義,責任鏈模式(Chain of Responsibility Pattern)為請求創(chuàng)建了一個接收者對象的...
    陳吉思_汗閱讀 166評論 0 0
  • 顧名思義,責任鏈模式(Chain of Responsibility Pattern)為請求創(chuàng)建了一個接收者對象的...
    CircleLee閱讀 850評論 0 3
  • zookeeper集群腳本 zkStart.sh zkStop.sh storm集群腳本 stormStart.s...
    先生_呂閱讀 339評論 0 0