設計模式12_責任鏈模式

          本文是在學習中的總結,歡迎轉載但請註明出處:http://blog.csdn.net/pistolove/article/details/104454774


1、定義

          責任鏈模式是一種對象的行爲模式。在責任鏈模式裏,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端並不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。(摘自《JAVA與模式》)


2、說明

          在日常業務開發中,經常會遇到類似如下的業務場景:(1)參數校驗;(2)業務數據入庫;(3)業務邏輯處理;(4)調用第三方服務。類似這樣的場景可能會面臨業務複雜、情況多變的情況,但它們的流程卻又大致相同。這時候,就可以考慮使用責任鏈模式,將各種不同的處理場景抽象爲責任鏈中的一環,請求到來時沿着鏈條一次處理,最終完成處理並響應。這使得業務邏輯之間的耦合度降低,增強了系統的可擴展性。

          責任鏈模式使得多個處理對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關係,將這些處理器對象連成一條線,並沿着這條鏈傳遞請求,直到有一個處理器對象處理它爲止。

          責任鏈的處理者負責處理請求,客戶只需要將請求發送到責任鏈上即可,無需關心請求的處理細節和傳遞,將請求的發送者和處理者解耦。

          比較典型的示例如J2EE中的Filter設計。


3、角色

          抽象處理者角色:定義一個處理請求的接口,包含抽象處理方法和後繼處理對象的引用。

          具體處理者角色:實現抽象處理者的處理方法,如果可以則處理本次請求,將請求轉給它的後繼者。

          客戶角色:創建處理鏈,並向鏈頭具體的處理者對象提交請求,它不關心處理的細節和請求的傳遞過程。


4、類圖

在這裏插入圖片描述


5、示例

          相關類如下所示:

/**
 * 定義Handler接口
 */
public interface Handler<T> {

    void handlerRequest(T request);
}
/**
 * 抽象Handler類
 */
public abstract class AbstractHandler implements Handler<String> {
    private Handler next;

    public Handler getNext() {
        return next;
    }

    public void setNext(Handler next) {
        this.next = next;
    }
}
/**
 * 參數校驗handler實現類
 */
public class ConcreteHandlerA extends AbstractHandler {

    @Override
    public void handlerRequest(String request) {
        // 判斷是否需要自己處理
        if (StringUtils.isNotEmpty(request)) {
            System.out.println("ConcreteHandlerA 參數檢驗處理");
        }

        // 轉交給下一個處理着
        if (getNext() != null) {
            getNext().handlerRequest(request);
        }
    }
}
/**
 * 具體業務handler實現類
 */
public class ConcreteHandlerB extends AbstractHandler {
    @Override
    public void handlerRequest(String request) {
        // 判斷是否需要自己處理
        if (request.equalsIgnoreCase("test")) {
            System.out.println("ConcreteHandlerB 業務處理");
        }

        // 轉交給下一個處理着
        if (getNext() != null) {
            getNext().handlerRequest(request);
        }
    }
}
/**
 * client
 */

    public static void main(String[] args) {
        AbstractHandler handlerA = new ConcreteHandlerA();
        AbstractHandler handlerB = new ConcreteHandlerB();
        handlerA.setNext(handlerB);

        handlerA.handlerRequest("test");

    }
}

運行結果:

ConcreteHandlerA 參數檢驗處理
ConcreteHandlerB 業務處理


6、總結

         
適用場景:

  • 有多個處理器對象可以處理一個請求,哪個處理器對象處理該請求在運行時動態確定。
  • 在不明確指定接收者的情況下,向多個處理器對象中的一個提交請求。
  • 可以動態指定一組處理器對象處理請求。

         
優點:

  • 降低耦合,使得請求發送者無需知道是哪個處理器對象處理請求。
  • 簡化對象的相互連接 。
  • 增強了給對象指派責任的靈活性 。
  • 方便添加新的請求處理類。

          本文只是簡單介紹了責任鏈模式,並未對其進行深入探討,略顯粗糙。希望本文對你有所幫助。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章