名称:职责链模式
意图:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
适用环境:
1、有多个对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
2、你想在不明确指定的接收者的情况下,向多个对象中的一个提交一个请求,。
3、可处理一个请求的对象集合应被动态指定。
abstractclassHandler
{
protectedHandlersuccessor;
publicvoidSetSuccessor(Handlersuccessor)
{
this.successor = successor;
}
publicabstractvoidHandleRequest(intrequest);
}
classConcreteHandler1:Handler
{
publicoverridevoidHandleRequest(intrequest)
{
if(request >= 0 && request < 10)
{
Console.WriteLine("{0} Handled request {1}",
this.GetType().Name, request);
}
elseif(successor != null)
{
successor.HandleRequest(request);
}
}
}
classConcreteHandler2: Handler
{
publicoverridevoidHandleRequest(intrequest)
{
if(request >= 10 && request < 20)
{
Console.WriteLine("{0} handled request {1}",
this.GetType().Name, request);
}
elseif(successor != null)
{
successor.HandleRequest(request);
}
}
}
classConcreteHandler3: Handler
{
publicoverridevoidHandleRequest(intrequest)
{
if(request >= 20 && request < 30)
{
Console.WriteLine("{0} handled request {1}",
this.GetType().Name, request);
}
elseif(successor != null)
{
successor.HandleRequest(request);
}
}
}
调用:
Handlerh1 = newConcreteHandler1();
Handlerh2 = newConcreteHandler2();
Handlerh3 = newConcreteHandler3();
h1.SetSuccessor(h2);
h2.SetSuccessor(h3);
int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };
foreach(intrequest inrequests)
{
h1.HandleRequest(request);
}
输出:
ConcreteHandler1 Handled request 2
ConcreteHandler1 Handled request 5
ConcreteHandler2 handled request 14
ConcreteHandler3 handled request 22
ConcreteHandler2 handled request 18
ConcreteHandler1 Handled request 3
ConcreteHandler3 handled request 27
ConcreteHandler3 handled request 20