2010年4月16日 星期五

Design Pattern : 14 Chain of Responsibility


轉送,當對於一個複雜的問題處理,可以把問題拆解成多個單一的問題處理方法(Support)每個Support,遇到丟進來的問題,會試著去解決
Support.support(trouble)
當無法解決時,就看看是否已經有利用Support.setNext(nextSupport),設定好下一個Support
如果有,就把問題丟給下一個support處理
nextSupport.support(trouble)
這樣的做法,可以讓每個Class可以很單純的處理一個問題,而且可以彈性的串接不同的Command

參與者
1.abstract Support
在Support這主要的Class內定義好程式判斷的流程,也就是support function
決定了判斷邏輯,後面繼承者,只需要把問題處理的部份(resolve)實作即可

public abstract class Support {
  public Support setNext(Support next){
     this.next=next;
     return next;
  }
  public final void support(Trouble trouble){
    if(resolve(trouble)){
        success();
    }else{
        fail();
        if(next!=null){
          next.support(trouble);
        } 
    }
  }
 protected abstract boolean resolve(Trouble trouble);
 private void success(){}
 private void fail(){}
}


2.RealSupport
可以針對各式的解決方法,產生多個不同的support子類別
每個class的都只要針對resolve function實作處理的結果即可

public Class RealSupport01 extends Support{
    protected boolean resolve(Trouble trouble){
              ......
      }
}



public Class RealSupport02 extends Support{
     protected boolean resolve(Trouble trouble){
         ......
     }
}


4.Trouble

public Class Trouble{...} 



5.Main
外部程式,產生各個解決問題的support實體,並利用
setNext設定其解決問題的順序

Support sp1=new RealSupport01();
Support sp2=new RealSupport02();
sp1.setNext(sp2);
sp1.support(new Trouble());


 

沒有留言: