責任鏈模式

主要解決:職責鏈上的處理者負責處理請求吩屹,客戶只需要將請求發(fā)送到職責鏈上即可扫外,無須關心請求的處理細節(jié)和請求的傳遞摹芙,所以職責鏈將請求的發(fā)送者和請求的處理者解耦了纯路。

何時使用:在處理消息的時候以過濾很多道。

如何解決:攔截的類都實現(xiàn)統(tǒng)一接口逊拍。
使用場景: 1上鞠、有多個對象可以處理同一個請求,具體哪個對象處理該請求由運行時刻自動確定芯丧。 2芍阎、在不明確指定接收者的情況下,向多個對象中的一個提交一個請求缨恒。 3谴咸、可動態(tài)指定一組對象處理請求。

需求:輸出比當前級別低的所有級別的日志

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

步驟 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)建不同類型的記錄器优俘。賦予它們不同的錯誤級別京办,并在每個記錄器中設置下一個記錄器。每個記錄器中的下一個記錄器代表的是鏈的一部分帆焕。

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 a debug level information.");
 
      loggerChain.logMessage(AbstractLogger.ERROR, 
         "This is an error information.");
   }
}

步驟 4
執(zhí)行程序惭婿,輸出結果:

Standard Console::Logger: This is an information.
File::Logger: This is a debug level information.
Standard Console::Logger: This is a 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.
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市叶雹,隨后出現(xiàn)的幾起案子财饥,更是在濱河造成了極大的恐慌,老刑警劉巖折晦,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钥星,死亡現(xiàn)場離奇詭異,居然都是意外死亡满着,警方通過查閱死者的電腦和手機谦炒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門贯莺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宁改,你說我怎么就攤上這事缕探。” “怎么了还蹲?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵撕蔼,是天一觀的道長。 經(jīng)常有香客問我秽誊,道長,這世上最難降的妖魔是什么琳骡? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任锅论,我火速辦了婚禮,結果婚禮上楣号,老公的妹妹穿的比我還像新娘最易。我一直安慰自己,他們只是感情好炫狱,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布藻懒。 她就那樣靜靜地躺著,像睡著了一般视译。 火紅的嫁衣襯著肌膚如雪嬉荆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天酷含,我揣著相機與錄音鄙早,去河邊找鬼。 笑死椅亚,一個胖子當著我的面吹牛限番,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呀舔,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼弥虐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了媚赖?” 一聲冷哼從身側響起霜瘪,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎省古,沒想到半個月后粥庄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡豺妓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年惜互,在試婚紗的時候發(fā)現(xiàn)自己被綠了布讹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡训堆,死狀恐怖描验,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坑鱼,我是刑警寧澤膘流,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站鲁沥,受9級特大地震影響呼股,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜画恰,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一彭谁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧允扇,春花似錦缠局、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至糊治,卻和暖如春唱矛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背俊戳。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工揖赴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抑胎。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓燥滑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親阿逃。 傳聞我的和親對象是個殘疾皇子铭拧,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

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

  • http://www.runoob.com/design-pattern/chain-of-responsibil...
    小陳阿飛閱讀 366評論 0 1
  • 責任鏈模式 顧名思義,責任鏈模式(Chain of Responsibility Pattern)為請求創(chuàng)建了一個...
    _兜兜轉轉_閱讀 384評論 0 0
  • 顧名思義恃锉,責任鏈模式(Chain of Responsibility Pattern)為請求創(chuàng)建了一個接收者對象的...
    陳吉思_汗閱讀 157評論 0 0
  • 責任鏈模式 顧名思義搀菩,責任鏈模式(Chain of Responsibility Pattern)為請求創(chuàng)建了一個...
    WILL_HUNTING閱讀 177評論 0 0
  • 顧名思義,責任鏈模式(Chain of Responsibility Pattern)為請求創(chuàng)建了一個接收者對象的...
    CircleLee閱讀 795評論 0 3