1. 程式人生 > >Java 設計模式之責任鏈模式

Java 設計模式之責任鏈模式

責任鏈模式(Chain of Responsibliity) 縮寫COR

該模式屬於物件的行為模式。多個物件連成一條鏈,請求沿著這條鏈進行傳遞,直到有一個物件處理它為止,這樣使得多個物件都有機會處理請求,從而避免了請求的傳送者和接收者之間的耦合關係。


責任鏈模式涉及到的角色如下所示:

  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 觀察者模式來替換,以提高其執行效率。