1. 程式人生 > >設計模式 --- 責任鏈模式

設計模式 --- 責任鏈模式

1.定義

使多個物件都有機會處理請求,從而避免了請求的傳送者和接受者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,只到有物件處理它為止。

 

2.使用場景

多個物件可以處理同一請求,但具體由哪個物件處理則在執行時動態決定。

在請求處理者不明確的情況下向多個物件中的一個提交一個請求。

需要動態指定一組物件處理請求。

 

3.簡單實現

以一個費用報銷為例。組長只能審批1000元以下費用,主管能審批5000元以下費用,經理能審批10000元以下費用,一萬元以上需要老闆審批。

//領導抽象
abstract class Leader{
    //上一級領導處理  即 下一個處理節點
    protected Leader nextHandler;
    //自身能審批額度
    abstract int limit();
    //處理報銷行為
    abstract void handle(int money);

    //處理報銷請求
    final void handleRequest(int money){
        if (money <= limit()){
            handle(money);
        }else {
            //交給下一節點
            if (null != nextHandler){
                nextHandler.handleRequest(money);
            }
        }
    }
}

//組長
class GroupLeader extends Leader{

    @Override
    int limit() {
        //限額1000
        return 1000;
    }

    @Override
    void handle(int money) {
        System.out.println("組長批覆報銷" + money + " 元");
    }
}

//主管
class Director extends Leader{

    @Override
    int limit() {
        //限額5000
        return 5000;
    }

    @Override
    void handle(int money) {
        System.out.println("主管批覆報銷" + money + " 元");
    }
}

//經理
class Manager extends Leader{

    @Override
    int limit() {
        //限額10000
        return 10000;
    }

    @Override
    void handle(int money) {
        System.out.println("經理批覆報銷" + money + " 元");
    }
}

//Boss
class Boss extends Leader{

    @Override
    int limit() {
        //無限
        return Integer.MAX_VALUE;
    }

    @Override
    void handle(int money) {
        System.out.println("老闆牛逼!批覆報銷" + money + " 元");
    }
}

public class RespChainMode {

    public static void main(String[] args){
        //構造領導
        GroupLeader groupLeader = new GroupLeader();
        Director director = new Director();
        Manager manager = new Manager();
        Boss boss = new Boss();

        //設定交給上級處理
        groupLeader.nextHandler = director;
        director.nextHandler = manager;
        manager.nextHandler = boss;

        //請求報銷
        groupLeader.handleRequest(3489);
        groupLeader.handleRequest(20210);
    }
}

輸出:

 

4.小結

優點:

可以對請求者和處理者關係解耦,提高程式碼靈活性

缺點:

對請求處理者需要遍歷,如果處理者太多影響效能,特別是在一些遞迴呼叫中。