前一天晚上出發去附近國小操場跑步,但沒想到已經關閉了,沒想到公共區域是有限制開放時間的,第一次11點才去才發現,搬家前去的那間國中只有關燈沒有限制時間啊···。
最近案子又在追殺啦Orz。
責任鍊模式( Chain of Responsibility ):使多個物件都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個物件處理它為止。[DP]
-- 大話設計模式 p.363
擴充開放、修改封閉原則時。
畫出UML圖之後發現責任練模式與組合模式(Composite)非常的相似,但表現出的行為有所不同。Composite包含的物件是Component,這使得組合模式中的元件可以自由的組合,而Handler中所包含的是一種叫做Successor(後繼者)的物件,但是同樣是其他的Handler。
Handler是請求的接收者,Handler接收到請求(Request)後假如可以處理則處理之,不能處理則將這個請求發送給後繼者。
公司大問題要給CEO處理,小問題經理就可以了···
Handler類別,各個管理人的Superclass。
public abstract class Handler {
    Handler successor;
    public void setSuccessor(Handler successor){
        this.successor = successor;
    }
    public abstract void handleRequest(Trouble trouble);
}
經理類別
public class Manager extends Handler {
    public Manager(){
//        為了方便在這邊設定上級是誰
//        可以轉換到客戶端設定
        setSuccessor(new CEO());
    }
    @Override
    public void handleRequest(Trouble trouble) {
        if(trouble.getWeight() > 1000){
            successor.handleRequest(trouble);
        }else{
            System.out.println("Manager:" + trouble.getName() + "是小問題,不用擔心。" );
        }
    }
}
CEO類別
public class CEO extends Handler {
    @Override
    public void handleRequest(Trouble trouble) {
        System.out.println("CEO:" + trouble.getName() + "是誰搞的!叫他過來。");
    }
}
問題類別,屬性有問題名稱以及權重
public class Trouble {
    private String name;
    private int weight;
    public Trouble(String name, int weight) {
        this.name = name;
        this.weight = weight;
    }
    public String getName() {
        return name;
    }
    public int getWeight() {
        return weight;
    }
}
測試一下
public class Test {
    @org.junit.jupiter.api.Test
    public void test(){
        Handler manager = new Manager();
//        小問題
        Trouble smallTrouble = new Trouble("想加薪500", 500);
        manager.handleRequest(smallTrouble);
//        大問題
        Trouble bigTrouble = new Trouble("搞壞五十萬的機器",500000);
        manager.handleRequest(bigTrouble);
    }
}
結果
Manager:想加薪500是小問題,不用擔心。
CEO:搞壞五十萬的機器是誰搞的!叫他過來。
今天就討論到這邊,有什麼錯誤或問題歡迎留言私訊喔~
大大你好,你的設計模式30天鐵人賽我已經完整看完一輪,發現你在22天的代碼有些問題,雖然不妨礙閱讀,但還是提醒一下。trouble.getCode(),Trouble 裡面 沒有code這個屬性。
感謝!已修正錯誤