1、结构图
2、代码
/*********************************************************************
* 意图:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间
* 的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直
* 到有一个对象处理它为止。
* 适用性:
* 1、有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
* 2、你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
* 3、可处理一个请求的对象集合应被动态指定。
* 协作:当客户提交一个请求时,请求沿着链传递知道有一个ConcreteHandler
* 对象负责处理它。
* 作者:董怀信
* 日期:2009-06-05
* ******************************************************************/
using System;
namespace DesignPattern.BehavioralPattern
{
/// <summary>
/// 定义一个处理请求的接口。
/// (可选)实现后继链。
/// </summary>
public abstract class Handler
{
protected Handler m_nextHandler;
public abstract void HandleRequest(int request);
}
/// <summary>
/// 处理它所负责的请求。
/// 可访问它的后继者。
/// 如果可处理该请求,就处理之;否则将该请求转发给它的后继者。
/// </summary>
public class ConcreteHandler1:Handler
{
public ConcreteHandler1(Handler nextHandler)
{
m_nextHandler = nextHandler;
}
public override void HandleRequest(int request)
{
if (request % 2 == 1)
{
Console.WriteLine("ConcreteHandler1 can Handle this request;");
}
else if(m_nextHandler != null)
{
m_nextHandler.HandleRequest(request);
}
}
}
public class ConcreteHandler2 : Handler
{
public ConcreteHandler2(Handler nextHandler)
{
m_nextHandler = nextHandler;
}
public override void HandleRequest(int request)
{
if (0 == request % 2)
{
Console.WriteLine("ConcreteHandler2 can handle this request;");
}
else if (m_nextHandler != null)
{
m_nextHandler.HandleRequest(request);
}
}
}
/// <summary>
/// 向链上的具体处理者(ConcreteHandler)对象提交请求。
/// </summary>
public class Client
{
public void Test()
{
Handler handler1 = new ConcreteHandler1(null);
Handler handler2 = new ConcreteHandler2(handler1);
handler2.HandleRequest(3);
handler2.HandleRequest(4);
}
}
}