客户端应用
#region 办公室报销责任链
Console.WriteLine("-------办公室报销责任链----------");
KeZhang ke = new KeZhang("科长");
ChuZhang chu = new ChuZhang("处长");
JuZhang ju = new JuZhang("局长");
Receipt r1 = new Receipt(360, "请客吃饭.");
Receipt r2 = new Receipt(760, "处室活动开销.");
Receipt r3 = new Receipt(360, "采购办公用品.");
//设置责任链
ke.SetSuccessor(chu);
chu.SetSuccessor(ju);
//责任处理
ke.HandleRequest(r1);
ke.HandleRequest(r2);
ke.HandleRequest(r3);
Console.ReadKey();
#endregion
总结
1、何时采用
从代码角度来说,如果一个逻辑的处理由不同责任对象完成,客户端希望能自定义这个处理流程并且不希望直接和多个责任对象发生耦合的时候可以考虑责任链模式。
从应用角度来说,如果对一个事情的处理存在一个流程,需要经历不同的责任点进行处理,并且这个流程比较复杂或只希望对外公开一个流程的入口点的话可以考 虑责任链模式。其实,责任链模式还可以在构架的层次进行应用,比如.NET中的层次异常处理关系就可以看作是一种责任链模式。
2、实现要点
(1)有一个抽象责任角色,避免各责任类型之间发生耦合。
(2)抽象责任角色中定义了后继责任角色,并对外提供一个方法供客户端配置。
(3)各具体责任类型根据待处理对象的状态结合自己的责任范围来判断是否能处理对象,如果不能处理提交给上级责任人处理(也就是纯的责任模式,要么自己处理要么提交给别人)。当然,也可以在进行部分处理后再提交给上级处理(也就是不纯的责任链模式)。
(4)需要在客户端链接各个责任对象,如果链接的不恰当,可能会导致部分对象不能被任何一个责任对象进行处理。
3、注意事项
责任链模式和状态模式的区别在于,前者注重责任的传递,并且责任链由客户端进行配置,后者注重对象状态的转换,这个转换过程对客户端是透明的。