職責鏈模式(Chain Of Responsibility),其含義是使多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關係。將這些對象連成一條鏈,並沿着這條鏈傳遞該請求,知道有一個對象處理它爲止,咱們能夠考慮現實中的軍情傳遞狀況,以及java語言中的異常處理機制。java
這個想法是給多個對象處理一個請求的機會,從而解耦發送者然後接受者。該請求沿對象鏈傳遞直至其中一個對象處理它,從第一個對象開始,鏈中收到請求的對象要麼親自處理它,要麼轉發給鏈中的下一個候選者。提交請求的對象並不明確地知道哪個對象將會處理它——咱們說該請求有一個隱式的接收者。要沿鏈發轉請求,並保證接收者爲隱式的,每一個在鏈上的對象都有一致的處理請求和訪問鏈上後繼者的接口。ide
其適用性:性能
有多個的對象能夠處理一個請求,哪一個對象處理該請求運行時刻自動肯定,測試
你想在不明確指定接收者的狀況下,向多個對象中的一個提交一個請求,this
可處理一個請求的對象集合應被動態指定。spa
其結構圖以下: code

一個典型的對象結構可能以下所示:對象
該模式有個缺陷就是一個請求可能會沒有被正確配置而得不處處理,而在傳遞的時候丟失了。責任鏈模式不必定就是一個鏈表,只是爲了方便敘述,並且順序執行因此大都這麼解釋,其還能夠是一個環鏈,或者一個樹結構的一部分。blog
本人的實現是經過在抽象類Handle的各個子類判斷是否有父類,若是有就交給父類進行Request的處理,這樣雖然簡單了,但也僅僅是爲了實現而實現。看到過一個經典的實現是在Handle有個options屬性,每一個ConcreteHandle根據options的值,來決定是否把處理權交給父類,以爲這個很好,很像異常處理機制了。遂以爲本身的實現很糟,以下:接口
package
org.designpattern.behavioral.chainOfResponsibility;
public
abstract
class Handle {
private Handle successor;
protected Handle(){
}
public
void setSuccessor(Handle successor) {
this.successor = successor;
}
public Handle getSuccessor() {
return successor;
}
public
abstract
void HandleRequest();
}
各個具體Handle類就是實現HandleRequest方法就好了,以下所示的:
package
org.designpattern.behavioral.chainOfResponsibility;
public
class ConcreteHandleA
extends Handle {
public ConcreteHandleA() {
super();
}
@Override
public
void HandleRequest() {
//
To change body of implemented methods use File | Settings | File Templates.
if(
this.getSuccessor() !=
null){
System.out.println("deliver the control from " +
this.getClass().getSimpleName() + " to the next handler.." +
this.getSuccessor().getClass().getSimpleName());
this.getSuccessor().HandleRequest();
}
else{
System.out.println("handle this problem by ConcreteHandleA!");
}
}
}
其餘的ConcreteHandle類都相似實現,下面是客戶端測試類:
package
org.designpattern.behavioral.chainOfResponsibility;
public
class Main {
public
static
void main(String[] args) {
Handle h1 =
new ConcreteHandleA();
Handle h2 =
new ConcreteHandleB();
Handle h3 =
new ConcreteHandleC();
h1.setSuccessor(h2);
h2.setSuccessor(h3);
h1.HandleRequest();
h2.HandleRequest();
h3.HandleRequest();
}
}
責任鏈模式常與Composite模式一塊兒使用,該模式的處理是由客戶端設置的狀態動態決定的,把請求傳遞給不一樣的處理對象,固然並不保證請求會必定被處理,該模式會有必定的性能損耗,若是要擴展的話,Handle因爲是統一的接口須要進行修改。