責任鏈模式

1類圖

這裏寫圖片描述

2定義:

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

3應用場景:

3.1 多個對象可以處理同一個請求,但具體由那個對象則在運行時動態決定。

3.2 在請求處理者的情況下向多個對象中的一個提交一個請求。

3.3 需要動態指定一組對象處理請求。

通用模板:

4抽象處理者

public abstract class Handler {
    protected Handler successor;
    public abstract void handleRequest(String condition);
}

5具體處理者1

public class ConcreteHandler1 extends Handler {

    @Override
    public void handleRequest(String condition) {
        // TODO Auto-generated method stub
        if(condition.equals("ConcreteHandler1")){
            System.out.println("ConcreteHandler1 handled");
            return;
        }else{
            successor.handleRequest(condition);
        }
    }

}

6具體處理者2

public class ConcreteHandler2 extends Handler {

    @Override
    public void handleRequest(String condition) {
        // TODO Auto-generated method stub
        if(condition.equals("ConcreteHandler2")){
            System.out.println("ConcreteHandler2 handled");
            return;
        }else{
            successor.handleRequest(condition);
        }
    }

}

7測試

public class Client {
    public static void main(String[] args) {
        ConcreteHandler1 handler1 = new ConcreteHandler1();
        ConcreteHandler2 handler2 = new ConcreteHandler2();

        handler1.successor = handler2;
        handler2.successor = handler1;

        handler1.handleRequest("ConcreteHandler2");
    }
}

簡單實現:

8抽象領導類

public abstract class Leader {
    protected Leader nextHandler;

    public final void handleRequest(int money){
        if(money <= limit()){
            handle(money);
        }else{
            if(null != nextHandler)
                nextHandler.handleRequest(money);
        }
    }

    public abstract int limit();
    public abstract void handle(int money);
}

9組長類

public class GroupLeader extends Leader {

    @Override
    public int limit() {
        return 1000;
    }

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

}

10主管類

public class Director extends Leader {

    @Override
    public int limit() {
        // TODO Auto-generated method stub
        return 5000;
    }

    @Override
    public void handle(int money) {
        // TODO Auto-generated method stub
        System.out.println("主管批覆報銷: " + money + "元");
    }

}

11經理類

public class Manager extends Leader {

    @Override
    public int limit() {
        // TODO Auto-generated method stub
        return 10000;
    }

    @Override
    public void handle(int money) {
        // TODO Auto-generated method stub
        System.out.println("經理批覆報銷: " + money + "元");
    }

}

12老闆類

public class Boss extends Leader {

    @Override
    public int limit() {
        // TODO Auto-generated method stub
        return Integer.MAX_VALUE;
    }

    @Override
    public void handle(int money) {
        // TODO Auto-generated method stub
        System.out.println("老闆批覆報銷: " + money + "元");
    }

}

13測試類

public class Test {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        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(9000);
    }
}
發佈了51 篇原創文章 · 獲贊 12 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章