文章出處

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

 

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!"));
  }
}

  


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()