责任链模式
很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
击鼓传花是一种热闹而又紧张的饮酒游戏。在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正。开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒。
击鼓传花便是责任链模式的应用。责任链可能是一条直线、一个环链或者一个树结构的一部分.
public abstract class Handler
{
public Handler handler;
public void SetSuccessor(Handler success)
{
this.handler = success;
}
public abstract void HandlerRequest(int request);
}
public class OneHandler : Handler
{
public override void HandlerRequest(int request)
{
if (request >= 0 && request < 10)
Console.WriteLine("{0} handled request {1}",
this, request);
else
if (handler != null) //父类
handler.HandlerRequest(request);
}
}
public class TwoHandler : Handler
{
public override void HandlerRequest(int request)
{
if (request >= 10 && request < 20)
Console.WriteLine("{0} handled request {1}",
this, request);
else
if (handler != null)
handler.HandlerRequest(request);
}
}
public class ThreeHandler : Handler
{
public override void HandlerRequest(int request)
{
if (request >= 20 && request < 30)
Console.WriteLine("{0} handled request {1}",
this, request);
else
if (handler != null)
handler.HandlerRequest(request);
}
}
实现
Handler OneH = new OneHandler();
Handler TwoH = new TwoHandler();
Handler ThreeH = new ThreeHandler();
//父类还是为空的,这样就构成一连续
OneH.SetSuccessor(TwoH); //事例父类中的对象
TwoH.SetSuccessor(ThreeH); ////事例父类中的对象
int[] requests ={ 2, 5, 12, 20 };
foreach (int req in requests)
{
OneH.HandlerRequest(req);
}
很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
击鼓传花是一种热闹而又紧张的饮酒游戏。在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正。开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒。
击鼓传花便是责任链模式的应用。责任链可能是一条直线、一个环链或者一个树结构的一部分.
public abstract class Handler
{
public Handler handler;
public void SetSuccessor(Handler success)
{
this.handler = success;
}
public abstract void HandlerRequest(int request);
}
public class OneHandler : Handler
{
public override void HandlerRequest(int request)
{
if (request >= 0 && request < 10)
Console.WriteLine("{0} handled request {1}",
this, request);
else
if (handler != null) //父类
handler.HandlerRequest(request);
}
}
public class TwoHandler : Handler
{
public override void HandlerRequest(int request)
{
if (request >= 10 && request < 20)
Console.WriteLine("{0} handled request {1}",
this, request);
else
if (handler != null)
handler.HandlerRequest(request);
}
}
public class ThreeHandler : Handler
{
public override void HandlerRequest(int request)
{
if (request >= 20 && request < 30)
Console.WriteLine("{0} handled request {1}",
this, request);
else
if (handler != null)
handler.HandlerRequest(request);
}
}
实现
Handler OneH = new OneHandler();
Handler TwoH = new TwoHandler();
Handler ThreeH = new ThreeHandler();
//父类还是为空的,这样就构成一连续
OneH.SetSuccessor(TwoH); //事例父类中的对象
TwoH.SetSuccessor(ThreeH); ////事例父类中的对象
int[] requests ={ 2, 5, 12, 20 };
foreach (int req in requests)
{
OneH.HandlerRequest(req);
}
浙公网安备 33010602011771号