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