設計模式之職責鏈模式

職責鏈模式(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因爲是統一的接口須要進行修改。

相關文章
相關標籤/搜索