責任鏈模式(Chain of Responsibility Pattern)

1.責任鏈模式概念

在《Head First Design Patterns》文中是這么介紹責任鏈模式的,“通過責任鏈模式,你可以為某個請求創建一個對象鏈。每個對象依次檢查此請求,并對其進行處理,或者將它傳給鏈中的下一個對象”,這句話已經很好了解了。責任鏈模式屬于行為型模式。
在這種模式中,通常每個接收者都包含對另一個接收者的引用。如果一個對象不能處理該請求,那么它會把相同的請求傳給下一個接收者,依此類推。

2.責任鏈模式的作用

避免請求發送者與接收者耦合在一起,讓多個對象都有可能接收請求,將這些對象連接成一條鏈,并且沿著這條鏈傳遞請求,直到有對象處理它為止。
職責鏈上的處理者負責處理請求,客戶只需要將請求發送到職責鏈上即可,無須關心請求的處理細節和請求的傳遞,所以職責鏈將請求的發送者和請求的處理者解耦了。

3.使用場景

1、有多個對象可以處理同一個請求,具體哪個對象處理該請求由運行時刻自動確定。
2、在不明確指定接收者的情況下,向多個對象中的一個提交一個請求。
3、可動態指定一組對象處理請求。

4.優點和缺點

優點
1、降低耦合度。它將請求的發送者和接收者解耦。
2、簡化了對象。使得對象不需要知道鏈的結構。
3、增強給對象指派職責的靈活性。通過改變鏈內的成員或者調動它們的次序,允許動態地新增或者刪除責任。
4、增加新的請求處理類很方便。
缺點
1、不能保證請求一定被接收。
2、系統性能將受到一定影響,而且在進行代碼調試時不太方便,可能會造成循環調用。
3、可能不容易觀察運行時的特征,有礙于除錯。

5.例子解析

類圖

這個例子是《Head First Design Patterns》上的,這里的例子需要說明的是客戶端發送給責任鏈上的請求,責任鏈上的對象將不會對請求進行攔截,處理了消息后并繼續將請求傳遞給下一個對象。當然你也可以選擇當有對象處理請求后,就停止傳遞請求。
責任鏈上的對象同意繼承這個類LHanlder,這個可以是接口也可以是抽象對象。

public abstract class LHanlder {

    private LHanlder next;
    private boolean successor;
    public void setNextTor(LHanlder next)
    {
        this.next = next;
    }
    
    public boolean isSuccessor() {
        return successor;
    }

    public void setSuccessor(boolean successor) {
        this.successor = successor;
    }


    public void handlerRequest(String msg) {
        if (successor) {
            print(msg);
        }
        if (next!=null) {
            next.handlerRequest(msg);
        }
    }
    
    public abstract void print(String msg);
}

責任鏈上的對象:FanHandler

public class FanHandler extends LHanlder {

    @Override
    public void print(String msg) {
        System.out.println("FanHandler處理:"+msg);
    }
}

責任鏈上的對象:SpamHandler

public class SpamHandler extends LHanlder {

    @Override
    public void print(String msg) {
        System.out.println("SpamHandler處理:"+msg);
    }
}

責任鏈上的對象:NewLocHandler

public class NewLocHandler extends LHanlder {

    @Override
    public void print(String msg) {
        System.out.println("NewLocHandler處理:"+msg);
    }
}

責任鏈上的對象:ComplainHandler

public class ComplainHandler extends LHanlder {

    @Override
    public void print(String msg) {
        System.out.println("ComplainHandler處理:"+msg);
    }
}

客戶端:

public class Client {

    public static void main(String[] args) {
        String msg ="郵件到!";
        LHanlder spam = new SpamHandler();
        LHanlder fan = new FanHandler();
        LHanlder complain = new ComplainHandler();
        LHanlder newLoc = new NewLocHandler();
        spam.setNextTor(fan);
        fan.setNextTor(complain);
        complain.setNextTor(newLoc);
        
        spam.setSuccessor(true);
        fan.setSuccessor(true);
        complain.setSuccessor(true);
        newLoc.setSuccessor(true);
        
        spam.handlerRequest(msg);
        
        spam.setSuccessor(true);
        fan.setSuccessor(true);
        complain.setSuccessor(false);
        newLoc.setSuccessor(true);
        spam.handlerRequest(msg);
    }
}
//輸出結果:
//SpamHandler處理:郵件到!
//FanHandler處理:郵件到!
//ComplainHandler處理:郵件到!
//NewLocHandler處理:郵件到!
//SpamHandler處理:郵件到!
//FanHandler處理:郵件到!
//NewLocHandler處理:郵件到!

6.總結
責任鏈模式比較簡單,可以查看參考文章里的例子,可以加深了解。
7.參考文章
http://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html
8.源碼地址
http://download.csdn.net/download/lgywsdy/10026552

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容