天天看點

設計模式-責任鍊模式

在一些情況下,對一個消息(含事件)的響應和處理需要很多對象來參與,這些對象對消息的處理有前後順序,形成一個處理鍊條,但對象是否真正處理消息有賴于在它之前的對象的處理政策,前一個對象處理後,後一個對象則不需參與處理,這就是責任鍊模式。現實中有很多類似的場景,比如上訪,上訪一般是從最基層的信訪部門接受信訪開始進行處理,如果下一級信訪部門無法處理,則交給上一級部門進行處理,這樣一級一級的處理,知道最高信訪部門。這樣所有層級的信訪部門就構成了一個責任鍊。

  在一些情況下,對一個消息(含事件)的響應和處理需要很多對象來參與,這些對象對消息的處理有前後順序,形成一個處理鍊條,但對象是否真正處理消息有賴于在它之前的對象的處理政策,前一個對象處理後,後一個對象則不需參與處理,這就是責任鍊模式。現實中有很多類似的場景,比如上訪,上訪一般是從最基層的信訪部門接受信訪開始進行處理,如果下一級信訪部門無法處理,則交給上一級部門進行處理,這樣一級一級的處理,知道最高信訪部門。這樣所有層級的信訪部門就構成了一個責任鍊。

public abstract class Chain_Successor
{
  protected Chain_Successor successor; //儲存後繼責任者的引用
  /// <summary>
  /// 處理需求
  /// </summary>
  /// <param name="request">需要處理的類</param>
  public abstract void HandleReqest(Chain_Request request);
  /// <summary>
  /// 設定後繼責任者
  /// </summary>
  /// <param name="successor">後繼責任者</param>
  public void SetChain_Successor(Chain_Successor successor)
  {
   this.successor = successor;
  }
}
public class Chain_ConcreateHandleA : Chain_Successor
{
  public Chain_ConcreateHandleA()
  {
  }
  public override void HandleReqest(Chain_Request request)
  {
   //如果自己能處理則處理,否則傳遞給後繼者
   if(request.Request_Type==1)
   {
    System.Windows.Forms.MessageBox.Show(this.ToString()+":"+request.Request_Parameters);
   }
   else
   {
    if(this.successor!=null)
                   successor.HandleReqest(request);
   }
  }

}
public class Chain_ConcreateHandleB : Chain_Successor
{
  public Chain_ConcreateHandleB()
  {
  }
  public override void HandleReqest(Chain_Request request)
  {
   //如果自己能處理則處理,否則傳遞給後繼者
   if(request.Request_Type==2)
   {
    System.Windows.Forms.MessageBox.Show(this.ToString()+":"+request.Request_Parameters);
   }
   else
   {
    if(this.successor!=null)
     successor.HandleReqest(request);
   }
  }

}
public class Chain_ConcreateHandleC : Chain_Successor
{
  public Chain_ConcreateHandleC()
  {
  }
  public override void HandleReqest(Chain_Request request)
  {
   //如果自己能處理則處理,否則傳遞給後繼者
   if(request.Request_Type==3)
   {
    System.Windows.Forms.MessageBox.Show(this.ToString()+":"+request.Request_Parameters);
   }
   else
   {
    if(this.successor!=null)
     successor.HandleReqest(request);
   }
  }

}
public class Chain_Request
{
  //下面的兩個參數可更加具體需要進行構造
        private int _Request_type;
  private string _Request_parameters;
  public Chain_Request(int Request_type,string RequestParameters)
  {
   this._Request_type = Request_type;
   this._Request_parameters = RequestParameters;
  }
  public int Request_Type
  {
   get
   {
    return _Request_type;
   }
   set
   {
                _Request_type = value;
   }  
  }
  public string Request_Parameters
  {
   get
   {
    return _Request_parameters;
   }
   set
   {
               _Request_parameters = value;
   }
  }
}
public class Chain_Client
{
  public static void Test()
  {
      Chain_Successor firstHandler = new Chain_ConcreateHandleA();
     Chain_Successor secondHandler = new Chain_ConcreateHandleB();
     Chain_Successor ThirdHandler = new Chain_ConcreateHandleC();
     firstHandler.SetChain_Successor(secondHandler);
     secondHandler.SetChain_Successor(ThirdHandler);
      firstHandler.HandleReqest(new Chain_Request(2,"hello,the world!"));
  }
}
      

  

繼續閱讀