1. 程式人生 > 其它 >責任鏈模式(職責鏈,學習筆記15)

責任鏈模式(職責鏈,學習筆記15)

原文:http://c.biancheng.net/view/1383.html

什麼時候用:

  1. 多個物件可以處理一個請求,但具體由哪個物件處理該請求在執行時自動確定。
  2. 可動態指定一組物件處理請求,或新增新的處理者。
  3. 需要在不明確指定請求處理者的情況下,向多個處理者中的一個提交請求。

主要優點:

  1. 降低了物件之間的耦合度。該模式使得一個物件無須知道到底是哪一個物件處理其請求以及鏈的結構,傳送者和接收者也無須擁有對方的明確資訊。
  2. 增強了系統的可擴充套件性。可以根據需要增加新的請求處理類,滿足開閉原則。
  3. 增強了給物件指派職責的靈活性。當工作流程發生變化,可以動態地改變鏈內的成員或者調動它們的次序,也可動態地新增或者刪除責任。
  4. 責任鏈簡化了物件之間的連線。每個物件只需保持一個指向其後繼者的引用,不需保持其他所有處理者的引用,這避免了使用眾多的 if 或者 if···else 語句。
  5. 責任分擔。每個類只需要處理自己該處理的工作,不該處理的傳遞給下一個物件完成,明確各類的責任範圍,符合類的單一職責原則。

主要缺點:
  1. 不能保證每個請求一定被處理。由於一個請求沒有明確的接收者,所以不能保證它一定會被處理,該請求可能一直傳到鏈的末端都得不到處理。
  2. 對比較長的職責鏈,請求的處理可能涉及多個處理物件,系統性能將受到一定影響。
  3. 職責鏈建立的合理性要靠客戶端來保證,增加了客戶端的複雜性,可能會由於職責鏈的錯誤設定而導致系統出錯,如可能會造成迴圈呼叫。

結構圖:

示例程式碼:

package chainOfResponsibility;

public class ChainOfResponsibilityPattern {
    public static void main(String[] args) {
        //組裝責任鏈
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        handler1.setNext(handler2);
        //提交請求
        handler1.handleRequest("two");
    }
}

//抽象處理者角色 abstract class Handler { private Handler next; public void setNext(Handler next) { this.next = next; } public Handler getNext() { return next; } //處理請求的方法 public abstract void handleRequest(String request); } //具體處理者角色1 class ConcreteHandler1 extends Handler { public void handleRequest(String request) { if (request.equals("one")) { System.out.println("具體處理者1負責處理該請求!"); } else { if (getNext() != null) { getNext().handleRequest(request); } else { System.out.println("沒有人處理該請求!"); } } } } //具體處理者角色2 class ConcreteHandler2 extends Handler { public void handleRequest(String request) { if (request.equals("two")) { System.out.println("具體處理者2負責處理該請求!"); } else { if (getNext() != null) { getNext().handleRequest(request); } else { System.out.println("沒有人處理該請求!"); } } } }