【設計模式】責任鏈模式

基本概念

為請求創(chuàng)建一個接收者對象的鏈,屬于行為型模式,在這種模式中,通常每個接收者都包含對另一個接收者的引用。如果一個對象不能處理該請求,那么它會把相同的請求傳給下一個接收者,依此類推

  • 意圖: 請求的接收者形成一條鏈,沿著這個鏈傳遞請求
  • 解決什么問題:將請求的發(fā)送者和請求的接收者進行解耦,請求的發(fā)送者只關心請求的發(fā)送,具體的處理流程不需要關心
  • 何時使用:處理消息的時候需要過濾很多道
  • 如何實現(xiàn):攔截的類實現(xiàn)統(tǒng)一接口
  • 應用場景:JavaWeb中的Filter JS中的事件冒泡

舉個例子

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

樣例類圖
//創(chuàng)建抽象logger
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);
    
}


//定義三個具體的logger類 重寫write方法
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);
   }
}

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

public class FileLogger extends AbstractLogger {

   public FileLogger(int level){
      this.level = level;
   }

   @Override
   protected void write(String message) {        
      System.out.println("File::Logger: " + message);
   }
}



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

程序輸出

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.

本文例子來自http://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 定義 責任鏈模式是一種對象的行為模式。在責任鏈模式中,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求...
    步積閱讀 2,147評論 1 5
  • 目錄 本文的結構如下: 引言 什么是責任鏈模式 模式的結構 典型代碼 代碼示例 純與不純的責任鏈模式 優(yōu)點和缺點 ...
    w1992wishes閱讀 1,321評論 4 14
  • 責任鏈模式的介紹 ? 責任鏈模式(Iterator Pattren),是行為型設計模式之一。什么是“鏈”?我們...
    Android天之驕子閱讀 818評論 0 1
  • 今天來說說程序員小猿和產(chǎn)品就關于需求發(fā)生的故事。前不久,小猿收到了產(chǎn)品的需求。 產(chǎn)品經(jīng)理:小猿,為了迎合大眾屌絲用...
    Jet啟思閱讀 6,470評論 0 14
  • 你風塵仆仆趕來 一步一步 拾級而上 山寺的大門被打開 院里的桃花正在凋謝 年邁的方丈問你何去何從 你把落寞化成凋謝...
    我是撿故事的人閱讀 298評論 4 7

友情鏈接更多精彩內(nèi)容