Java 設計模式之責任鏈模式
阿新 • • 發佈:2019-02-14
責任鏈模式(Chain of Responsibliity) 縮寫COR
該模式屬於物件的行為模式。多個物件連成一條鏈,請求沿著這條鏈進行傳遞,直到有一個物件處理它為止,這樣使得多個物件都有機會處理請求,從而避免了請求的傳送者和接收者之間的耦合關係。
責任鏈模式涉及到的角色如下所示:
1)抽象處理者(Handler)角色:定義處理請求的介面。如果需要可以定義出一個方法設定和返回對下家的引用,這個角色通常由一個Java抽象類或者Java介面實現。
2) 具體處理者(ConcreteHandler)角色:具體處理者接到請求後,可以選擇將請求處理掉,或者將請求傳給下家。由於具體處理者持有對下家的引用,因此,如果需要,具體處理者可以訪問下家。
抽象處理者 Handler 角色:
具體處理者(ConcreteHandler)角色
客戶端類
缺點:一個請求被處理可能需要遍歷整個責任鏈才可能完成(可以用樹的概念優化),執行效率比較低;
在某些情況下,責任鏈可以使用Observer 觀察者模式來替換,以提高其執行效率。
該模式屬於物件的行為模式。多個物件連成一條鏈,請求沿著這條鏈進行傳遞,直到有一個物件處理它為止,這樣使得多個物件都有機會處理請求,從而避免了請求的傳送者和接收者之間的耦合關係。
責任鏈模式涉及到的角色如下所示:
1)抽象處理者(Handler)角色:定義處理請求的介面。如果需要可以定義出一個方法設定和返回對下家的引用,這個角色通常由一個Java抽象類或者Java介面實現。
2) 具體處理者(ConcreteHandler)角色:具體處理者接到請求後,可以選擇將請求處理掉,或者將請求傳給下家。由於具體處理者持有對下家的引用,因此,如果需要,具體處理者可以訪問下家。
抽象處理者 Handler 角色:
public abstract class Handler { /** * 後繼責任物件 */ protected Handler successor; public abstract void handleRequest(); public Handler getSuccessor() { return successor; } public void setSuccessor(Handler successor) { this.successor = successor; } }
具體處理者(ConcreteHandler)角色
public class ConcreteHandler extends Handler {
@Override
public void handleRequest() {
if(getSuccessor() != null){
// 呼叫後繼責任物件處理
}else {
//TODO 自己處理
}
}
}
客戶端類
public class Client { public static void main(String[] args) { //組裝責任鏈 Handler handler1 = new ConcreteHandler(); Handler handler2 = new ConcreteHandler(); handler1.setSuccessor(handler2); //提交請求 handler1.handleRequest(); } }
時序圖如下:
責任鏈優缺點:
優點:不需要關心請求屬於哪種型別,責任鏈上的物件對於在自己職責範圍內的就可以處理請求,否則放棄處理,傳遞給下一個繼承者物件進行處理,無意降低了請求的傳送者與處理者之間的耦合性;缺點:一個請求被處理可能需要遍歷整個責任鏈才可能完成(可以用樹的概念優化),執行效率比較低;
在某些情況下,責任鏈可以使用Observer 觀察者模式來替換,以提高其執行效率。