
using System;
using System.Collections.Generic;
using System.Text;
///Chain of Responsibility(职责链,以下简称CoR)模式通过将多个对象串接成一条链(Chain),并沿着这条链传递上层应用传来的请求,
///直到有一个对象处理它为止,使得多个对象都有机会处理上层应用传来的请求,从而避免请求的发送者和接收者之间的耦合关系。
///add by jzh 2007-04-23
namespace DesignPattern
{
abstract class Handler
{
protected Handler successorHandler;
abstract public void HandleRequest(Request request);
public void SetSuccessor(Handler sucessor)
{
successorHandler = sucessor;
}
}
class ConcreteHandler1 : Handler
{
override public void HandleRequest(Request request)
{
if (request.RequestType == 1)
{
Console.WriteLine("Handler1 " + request.RequestParameters);
}
else
{
// next chain
if (successorHandler != null)
successorHandler.HandleRequest(request);
}
}
}
class ConcreteHandler2 : Handler
{
override public void HandleRequest(Request request)
{
if (request.RequestType == 2)
{
Console.WriteLine("Handler2 " + request.RequestParameters);
}
else
{
// next chain
if (successorHandler != null)
successorHandler.HandleRequest(request);
}
}
}
class ConcreteHandler3 : Handler
{
override public void HandleRequest(Request request)
{
if (request.RequestType == 3)
{
Console.WriteLine("Handler3 " + request.RequestParameters);
}
else
{
// next chain
if (successorHandler != null)
successorHandler.HandleRequest(request);
}
}
}
class Request
{
private int iRequestType;
private string strRequestParameters;
public Request(int requestType, string requestParameters)
{
iRequestType = requestType;
strRequestParameters = requestParameters;
}
public int RequestType
{
get
{
return iRequestType;
}
set
{
iRequestType = value;
}
}
public string RequestParameters
{
get
{
return strRequestParameters;
}
set
{
strRequestParameters = value;
}
}
}
public class Client
{
public static void Main(string[] args)
{
Handler aHandler = new ConcreteHandler1();
Handler bHandler = new ConcreteHandler2();
Handler cHandler = new ConcreteHandler3();
aHandler.SetSuccessor(bHandler);
bHandler.SetSuccessor(cHandler);
Request newRequest = new Request(2, "hi, jzh");
aHandler.HandleRequest(newRequest);
Console.ReadLine();
}
}
}