Chain of Responsibility
责任链模式:为了避免请求发送者和请求处理者耦合在一起,于是将宿友的请求的处理者通过前一对象记住其下一对象的引用而形成一条链;当由请求发生时,可讲请求沿着这条链进行传递,知道对象处理它为止。也被称为 职责链模式
最能体现责任链模式当属审批流程, 我们在审批的时候,经常会根据条件来判断是否能审批或者是否应该由下一级来审批, 比如:请假3天以内由直属领导审批,3-7天由部门经理审批等等。责任链模式可以动态的组装审批流程,按照一定的条件执行。
其UML图如下:
1、场景描述
请假审批流程
- 3天以内:直属领导
- 3-7天:部门经理
- 7天以上:总监
2、实现
/// <summary>/// 抽象处理者-抽象领导/// </summary>public abstract class AbstractLeader{// 下一审判者protected readonly AbstractLeader _next;public AbstractLeader(AbstractLeader next){this._next = next;}/// <summary>/// 审批/// </summary>public abstract void Approve(int days);}/// <summary>/// 具体处理者: 直属领导/// </summary>public class DirectLeader : AbstractLeader{public DirectLeader(AbstractLeader next) : base(next){}/// <summary>/// 审批/// </summary>/// <param name="days"></param>/// <exception cref="NotImplementedException"></exception>public override void Approve(int days){if (days < 3)Console.WriteLine("直属领导审批通过...");else if (_next != null)_next.Approve(days);elseConsole.WriteLine("审批不通过...");return;}}/// <summary>/// 具体处理者:部门经理/// </summary>public class Manager : AbstractLeader{public Manager(AbstractLeader next) : base(next){}public override void Approve(int days){if (days >= 3 && days < 7)Console.WriteLine("部门经理审批通过...");else if (_next != null)_next.Approve(days);elseConsole.WriteLine("审批不通过...");return;}}/// <summary>/// 具体处理者:总监/// </summary>public class RDDiretor : AbstractLeader{public RDDiretor(AbstractLeader next) : base(next){}public override void Approve(int days){if (days > 7)Console.WriteLine("总监审批通过...");else if (_next != null)_next.Approve(days);elseConsole.WriteLine("审批不通过...");return;}}// 客户端// 组装责任链AbstractLeader director = new RDDiretor(null);AbstractLeader manager = new Manager(director);AbstractLeader leader = new DirectLeader(manager);// 调用leader.Approve(2);Console.WriteLine("*********************");leader.Approve(5);Console.WriteLine("*********************");leader.Approve(8);
3、优缺点
优点:
- 每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则
- 增强了系统的可扩展性。可以根据需要增加新的请求处理类,满足开闭原则
- 可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任
缺点:
