Java大數據之路--責任鏈模式

責任鏈模式


概述

 責任鏈模式,在面向對象裏是一種軟件設計模式,它包含了一些命令對象和一系列的處理對象。使多個對象都有處理請求的機會,從而避免請求的發送者和接收者之間的耦合關係,這個請求沿着一條鏈下去直至處理完爲止。

角色

抽象處理者角色:定義出一個處理請求的接口,如果需要,接口中可以定義出一個方法以設定和返回下家的引用,這個角色通常是一個java抽象類或者是java的接口來實現的。

具體處理者角色:具體處理者接到請求後,可以選擇將請求處理掉,或者請求傳給下家。由於具體處理者持有對下家的引用,因此,如果需要具體處理者可以訪問下家。

優點

解耦了請求和處理,請求處理者只需要關注自己的需要的請求進行處理就好,對於不需要的請求,直接轉發給下一級處理者。

具備鏈式傳遞處理請求功能,請求發送者不需要知道鏈路中的接口,只需要等待處理結果,鏈路結構靈活,可以通過改變鏈路結構動態的新增或刪除任務。

易於增加新的處理者。

缺點

當責任鏈的鏈過長的時候,會降低請求處理的效率,處理者對象存在循環引用,可能會造成死循環,內存溢出。

不利於調試,邏輯比較複雜。

應用場景

多個對象處理同一個請求,但需要動態決定哪一個對象處理的時候。

代碼示例

/**
 * 測試
 */
public class ChainofResponsibilityDemo {
    public static void main(String[] args) {
        Handler handlerA = new HandlerA();
        Handler handlerB = new HandlerB();
        handlerA.setNext(handlerB);
        handlerA.getReq("AB");
    }
}
/**
 * 處理器抽象類
 */
abstract class Handler{
     Handler next;
    public void setNext(Handler next) {
        this.next = next;
    }
    public abstract void getReq(String req);
}

/**
 * 處理者A
 */
class HandlerA extends Handler{
    @Override
    public void getReq(String req) {
        if (req.contains("A")) {
            System.out.println(this.getClass().getSimpleName()+":處理器A處理了該請求");
        }
        if (this.next!=null){
            this.next.getReq(req);
        }
    }
}
/**
 * 處理者B
 */
class HandlerB extends Handler{
    @Override
    public void getReq(String req) {
        if (req.contains("B")) {
            System.out.println(this.getClass().getSimpleName()+":處理器B處理了該請求");
        }
        if (this.next!=null){
            this.next.getReq(req);
        }
    }
}
console:
HandlerA:處理器A處理了該請求
HandlerB:處理器B處理了該請求

 

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