<<設計模式之禪(第二版)>>——第十六章 責任鏈模式

定義:
  • 使多個對象都有機會處理請求,從而避免了請求的發送者和接收者之間的耦合關系。將這些對象形成一條鏈,并沿著這條鏈傳遞該請求,直到有對象處理它為止。
通用類圖:
責任鏈模式通用類圖
/*
 * 定義抽象的處理類
 * */
public abstract class Handler {
  // 根據當前設置的相關等級做出對應的處理
  private Handler nextHandler;

  final Response handleMessage(Request request) {
    Response response = null;
    // 指定不同的判斷條件
    if (request.getLevel().equals(this.getHandlerLevel())) {
        response = this.echo(request);
    } else {
        if (nextHandler != null) {
            response = this.nextHandler.handleMessage(request);
        } else {

        }
    }

    return response;
  }

  public void setNextHandler(Handler handler) {
    this.nextHandler = handler;
  }

  // 抽象出獲取等級和處理相應的方法
  abstract Level getHandlerLevel();

  abstract Response echo(Request request);
}


/*
 * 定義請求類
 * */
public class Request {
  Level getLevel() {
    return null;
  }
}

public class Response {
  // 返回的相應數據
}

/*
 * 定義一個請求和處理等級
 * */
public class Level {

}
public class HandlerOne extends Handler {

  @Override
  Level getHandlerLevel() {
    // TODO Auto-generated method stub
    return null;
  }

  @Override
  Response echo(Request request) {
    // TODO Auto-generated method stub
    return null;
  }

}

public class HandlerThree extends Handler {

  @Override
  Level getHandlerLevel() {
    // TODO Auto-generated method stub
    return null;
  }

  @Override
  Response echo(Request request) {
    // TODO Auto-generated method stub
    return null;
  }

}

public class HandlerTwo extends Handler {

  @Override
  Level getHandlerLevel() {
    // TODO Auto-generated method stub
    return null;
  }

  @Override
  Response echo(Request request) {
    // TODO Auto-generated method stub
    return null;
  }

}

public class Client {
  public static void main(String[] args) {
    // 創建所有可能的處理節點
    HandlerOne handlerOne = new HandlerOne();
    HandlerTwo handlerTwo = new HandlerTwo();
    HandlerThree handlerThree = new HandlerThree();
    // 設置責任連的執行順序
    handlerOne.setNextHandler(handlerTwo);
    handlerTwo.setNextHandler(handlerThree);

    Response response = handlerOne.handleMessage(new Request());
  }
}
優點:
  • 將請求和處理分開,解除耦合提高系統的靈活性
缺點:
  • 性能問題
  • 調試不便,特別是責任連較長、環節較多,由于采用了類似遞歸的方法,調試邏輯較復雜。
注意事項:
  • 需要控制鏈中節點的數量,避免出現超長鏈的情況,通常的做法是Handler中設置最大的節點數量,在setNext方法中判斷是否已經超過閾值,避免降低系統性能。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 工廠模式類似于現實生活中的工廠可以產生大量相似的商品,去做同樣的事情,實現同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 7,842評論 2 17
  • 1 場景問題# 1.1 申請聚餐費用## 來考慮這樣一個功能:申請聚餐費用的管理。 很多公司都有這樣的福利,就是項...
    七寸知架構閱讀 3,178評論 3 58
  • 設計模式匯總 一、基礎知識 1. 設計模式概述 定義:設計模式(Design Pattern)是一套被反復使用、多...
    MinoyJet閱讀 3,978評論 1 15
  • 1.責任鏈模式的定義及使用場景定義:責任鏈模式是行為型設計模式之一。使多個對象都有機會處理請求,從而避免了請求的發...
    GB_speak閱讀 328評論 0 0
  • 迎著太陽的我 看不見影子的模樣 慢慢的她 跟在我的身后,不言不語 把自己和影子裝進泡沫里 微微的風 帶我們到樹梢上...
    梧桐樹先生閱讀 216評論 0 1