責任鏈模式

1.定義#

使多個對象都有機會處理請求,從而避免了請求的發(fā)送者和接受者之間的耦合關系。將這些對象連成一條鏈。并沿著這條鏈傳遞該請求,直到有對象處理它為止。
責任鏈使用了一種遞歸的方式查找符合條件的對象處理請求。所有的處理對象被串聯成一個對象鏈,請求者從第一個對象開始從頭到尾嘗試每一個對象找到合適的對象則返回一個響應。Handler類使用模板模式實現了責任處理流程handleMessage;實現了設置責任鏈的方法setNext;定義了具體處理者ConcreteHandler的處理方法echo。
Invoke類封裝了責任鏈的構成方法setLink。

2.類圖#

類圖

3.實現#

3.1抽象處理者##

抽象處理者主要有三個職責:第一處理請求的方法handleMessage第二設置責任鏈的方法setNext第三定義具體處理者的處理方法echo

    public abstract class Handler {
      private Handler nextHandler;
      public final Response handleMessage(Request request)
      {
        Response response = null;
        //判斷是否由當前處理者處理
        if(this.getHandlerLevel().equals(request.getRequestLevel()))
        {
          response = this.echo(request);
        }else{
          //判斷是否有下一個處理者
          if(this.nextHandler != null)
          {
            response = this.nextHandler.handlerMessage(request);
          }
        }
        return response;
      }
      public void setNext(Handler _handler)
      {
        this.nextHandler = _handler;
      }
      //獲取當前處理者級別
      protected abstract Level getHandlerLevel();
      //當前處理者處理
      protected abstract Response echo(Request request);
    }
    ```
  ##3.2具體處理者##  

public class ConcreteHandler1 extends Handler{

protected Response echo(Request request)
{
  //處理任務
  return null;
}

protected Level getHandlerLevel()
{
  //獲取當前處理者等級
  return null;
}

}
public class ConcreteHandler2 extends Handler{

protected Response echo(Request request)
{
  //處理任務
  return null;
}

protected Level getHandlerLevel()
{
  //獲取當前處理者等級
  return null;
}

}
public class ConcreteHandler3 extends Handler{

protected Response echo(Request request)
{
  //處理任務
  return null;
}

protected Level getHandlerLevel()
{
  //獲取當前處理者等級
  return null;
}

}


##3.3相關模塊##

public class Level{
//處理等級
}

public class Request{
public Level getRequestLevel(){}
}

public class Response{
//處理者響應數據
}


##3.4責任鏈組裝者##

public class Invoke{
public static Handler concreteHandler1 = new ConcreteHandler1();
public static Handler concreteHandler2 = new ConcreteHandler2();
public static Handler concreteHandler3 = new ConcreteHandler3();

public Handler  getHandlerLink(){
  concreteHandler1.setNext(concreteHandler2);
  concreteHandler2.setNext(concreteHandler3);
  return concreteHandler1;
}

}


##3.5場景類##

public class Client{
public static void main(String[] args)
{
Invoke invoke = new Invoke();
Response response = invoke.getHandlerLink().handlerMessage(request);
}
}


#4責任鏈優(yōu)缺點#
優(yōu)點:請求和處理分離。
缺點:責任鏈過長導致性能問題。注意控制責任鏈長度。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容