設計模式- 責任鏈設計模式

責任鏈模式

責任鏈模式原理

名詞解釋:

責任鏈模式: 如果有多個對象都有機會處理請求,責任鏈可使請求的發送者和接收者解構, 請求沿着責任鏈傳遞, 知道有一個對象處理了他爲止.

-- 購買請求決策項目

  1. 決策因素: 價格

  2. 決策級別: 組長, 部長, 副總, 總裁

  3. 考慮擴展性:

  4. 如何設計:

 

 

 

和策略模式不同, 客戶端不需要知道有幾個處理者. 到這某個節點處理不了就扔下個

  1. 體系結構

  2.  

     

責任鏈的優缺點:

優點:

  • 將請求的發送者和接收者解耦, 使多個對象都有機會處理這個請求;

  • 可以簡化對象, 因爲它無須知道鏈的解構

  • 可以動態的增加或者刪減處理請求的鏈解構

缺點:

  • 請求從鏈的開頭進行遍歷, 對性能有一定損耗

  • 並不保證請求一定被處理

 

實現:

 

實現

我們創建抽象類 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.
Standa

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章