通訊兵(Chain of Responsibility) (轉)

worldblog發表於2008-01-31
通訊兵(Chain of Responsibility) (轉)[@more@]

 

如果看英文名字的話你可能會想到責任鏈.其定義為使多個都有機會處理

請求,從而避免請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,

並沿著這條鏈傳遞該請求,直到有一個物件處理它為止。那麼可能會誤解.

其實這個很類似訊息通訊.也就好象是在對應的訊息.至少我看完這個

模式首先想到的就是這個.的確也是十分象.你甚至也可以構造一個控制程式碼來判斷訊息

處理函式.當然我們沒必要那麼些 ...case  ....那不方便.而且

要適合物件導向原則.其實這很靈活可以想到的程式碼方案很多.單必須考慮

1.要適合擴充.2.要方便.下面是我提供的一組解決方案

假設.一個家長對他的孩子有一下訊息"吃飯" "睡覺" "讀書",吃飯必須要在

餐廳.睡覺在臥室.讀書在圖書管

//構造訊息控制程式碼

public interface IHandler{
  //string HandlerName{get;}
  void  Request();
}

//事件
public class DiningHandler : IHandler{
  public void  Request(){
  Console.WriteLine("吃飯");
  }
}

public class RestHandler : IHandler{
  public void  Request(){
  Console.WriteLine("睡覺");
  }
}

public class ReadHandler : IHandler{
  public void  Request(){
  Console.WriteLine("讀書");
  }
}

//事件管理者
public class ManagerHandler {
  public IHandler ;//事件源
 
  public ManagerHandler(IHandler s){
  this.source=s;
  }

  public void Execute(IRequest request){
  request.Execute(this.source);//有實際的來
  }
}

//處理器
public interface IRequest{
  void Execute (Ihandler source);
}

public class myRequest : IRequest{
 
  public  void Execute (Ihandler source){
  source.Request(); 
  }
}

//客戶呼叫
public class Client
  {
  public static int Main(string[] args)
  {
  IHandler Dining=new DiningHanlder();
  IHandler Rest=new RestHandler();
  IHandler Read=new ReadHandler();

  MangerHandler mh=new MangerHandler(Rest);
  IRequest mr=new myRequest();
 
  mh.Execute(mr);

  mh.source=Dining;
  mh.Execute(mr); 
  return 0;
  }
  }
}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-998953/,如需轉載,請註明出處,否則將追究法律責任。

相關文章