代碼詳解設計模式--責任鏈模式

責任鏈模式

  責任鏈模式爲請求創建了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發送者和接收者進行解耦。

  • 優點
  1. 降低耦合度。它將請求的發送者和接收者解耦;
  2. 簡化了對象。使得對象不需要知道鏈的結構;
  3. 增強給對象指派職責的靈活性。通過改變鏈內的成員或者調動它們的次序,允許動態地新增或者刪除責任;
  4. 增加新的請求處理類很方便。
  • 缺點
  1. 不能保證請求一定被接收;
  2. 系統性能將受到一定影響,而且在進行代碼調試時不太方便,可能會造成循環調用;
  3. 可能不容易觀察運行時的特徵,有礙於除錯。

UML

// 記錄器抽象類
public abstract class AbstractLogger {
   public static int INFO = 1;
   public static int WARN = 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);
}

// 信息打印器
public class InfoLogger extends AbstractLogger {
   public InfoLogger(int level){
      this.level = level;
   }
 
   @Override
   protected void write(String message) {    
      System.out.println("INFO: " + message);
   }
}

// 警告打印器
public class WarnLogger extends AbstractLogger {
   public WarnLogger(int level){
      this.level = level;
   }
 
   @Override
   protected void write(String message) {    
      System.out.println("WARN: " + message);
   }
}

// 錯誤打印器
public class ErrorLogger extends AbstractLogger {
   public ErrorLogger(int level){
      this.level = level;
   }
 
   @Override
   protected void write(String message) {    
      System.out.println("ERROR: " + message);
   }
}

// 使用示例
public class Demo {
   private static AbstractLogger getChainOfLoggers(){
      AbstractLogger infoLogger = new ConsoleLogger(AbstractLogger.INFO);
      AbstractLogger warnLogger = new WarnLogger(AbstractLogger.WARN);
      AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
      errorLogger.setNextLogger(warnLogger);
      warnLogger.setNextLogger(infoLogger);
      return errorLogger;    
   }
 
   public static void main(String[] args) {
      AbstractLogger loggerChain = getChainOfLoggers();
      loggerChain.logMessage(AbstractLogger.INFO, "信息日誌");
      loggerChain.logMessage(AbstractLogger.WARN, "警告日誌");
      loggerChain.logMessage(AbstractLogger.ERROR, "錯誤日誌");
   }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章