責(zé)任鏈模式

一、模式簡介

定義:為了避免請求發(fā)送者與多個請求處理者耦合在一起,將所有請求的處理者通過前一對象記住其下一個對象的引用而連成一條鏈;當(dāng)有請求發(fā)生時,可將請求沿著這條鏈傳遞,直到有對象處理它為止。
場景:有多個對象可以處理一個請求,哪個對象處理該請求由運行時刻自動確定??蓜討B(tài)指定一組對象處理請求,或添加新的處理者。在不明確指定請求處理者的情況下,向多個處理者中的一個提交請求。

  • 角色結(jié)構(gòu):
  • 抽象處理者(Handler)角色:定義一個處理請求的接口,包含抽象處理方法和一個后繼連接。
  • 具體處理者(Concrete Handler)角色:實現(xiàn)抽象處理者的處理方法,判斷能否處理本次請求,如果可以處理請求則處理,否則將該請求轉(zhuǎn)給它的后繼者。
  • 客戶端(Client)角色:創(chuàng)建處理鏈,并向鏈頭的具體處理者對象提交請求,它不關(guān)心處理細(xì)節(jié)和請求的傳遞過程。

二、模式實現(xiàn)

public abstract class AbstractHandler { -> 抽象處理者
    private AbstractHandler next;

    public AbstractHandler getNext() {
        return next;
    }

    public void setNext(AbstractHandler next) {
        if(this.next != null){
            next.next = this.next;
        }
        this.next = next;
    }

    public abstract void handle(String department);
}

public class AdminConcreteHandler extends AbstractHandler { -> 具體處理者
    @Override
    public void handle(String department) {
        System.out.println("請求經(jīng)過行政部");
        if ("admin".equals(department)) {
            System.out.println("行政部處理請求");
        } else {
            if (getNext() != null) {
                getNext().handle(department);
            }
        }
    }
}

public class SaleConcreteHandler extends AbstractHandler { -> 具體處理者
    @Override
    public void handle(String department) {
        System.out.println("請求經(jīng)過銷售部");
        if ("sale".equals(department)) {
            System.out.println("銷售部處理請求");
        } else {
            if (getNext() != null) {
                getNext().handle(department);
            }
        }
    }
}

public class TechnicalConcreteHandler extends AbstractHandler {
    @Override
    public void handle(String department) {
        System.out.println("請求經(jīng)過技術(shù)部");
        if ("technical".equals(department)) {
            System.out.println("技術(shù)部處理請求");
        } else {
            if (getNext() != null) {
                getNext().handle(department);
            }
        }
    }
}

以尋求公司的某個部門協(xié)助為例子,各個部門串聯(lián)形成責(zé)任鏈,符合條件則截獲請求并完成,否則流向下一個部門,執(zhí)行相同的步驟,直至符合條件為止。

AbstractHandler technical = new TechnicalConcreteHandler();
AbstractHandler sale = new SaleConcreteHandler();
AbstractHandler admin = new AdminConcreteHandler(); -> 客戶端
admin.setNext(technical);
admin.setNext(sale);
admin.handle("technical");
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容