.net简单的审批责任链模式学习
昨天学习责任链模式的教学视频,今天尝试着一个关于审批的责任链模式练习,做一个学习总结!
首先就是审批的抽象类,具体的审批等级继承于该抽象类。
抽象类:
//审批抽象类 public abstract class BaseApproval { public string Name { get; set; } public BaseApproval _NextAudit = null; public void SetNext(BaseApproval approval) { _NextAudit = approval; } public abstract void Audit(ApplyContext context); public void NextAudit(ApplyContext context) { if (this._NextAudit != null) { this._NextAudit.Audit(context); } } }
项目经理:
/// <summary> /// 项目经理 /// </summary> public class ProjectManagers : BaseApproval { public override void Audit(ApplyContext context) { Console.WriteLine("这里是项目经理{0}审批", this.Name); if (context.Hour <= 24) { Console.WriteLine("项目经理{0}审批成功", this.Name); context.AuditStatus = true; } else { Console.WriteLine("已经超出项目经理的权限范围,已往上递交"); base.NextAudit(context); } } }
主管:
/// <summary> /// 主管 /// </summary> public class Charge : BaseApproval { public override void Audit(ApplyContext context) { Console.WriteLine("这里是主管{0}审批", this.Name); if (context.Hour <= 48) { Console.WriteLine("项目主管{0}审批成功", this.Name); context.AuditStatus = true; } else { Console.WriteLine("已经超出主管的权限范围,已往上递交"); base.NextAudit(context); } } }
项目总监:
/// <summary> /// 项目总监 /// </summary> public class ProjectDirector : BaseApproval { public override void Audit(ApplyContext context) { Console.WriteLine("这里是项目总监{0}审批", this.Name); if (context.Hour <= 72) { Console.WriteLine("项目总监{0}审批成功", this.Name); context.AuditStatus = true; } else { Console.WriteLine("已经超出项目总监的权限范围,已往上递交"); base.NextAudit(context); } } }
然后就是审批申请实现:
class Program { static void Main(string[] args) { //审批申请 ApplyContext context = new ApplyContext { Id = "10000", Name = "小明", Hour = 72 }; //项目经理 BaseApproval pm = new ProjectManagers { Name = "张三" }; //主管 BaseApproval charge = new Charge { Name = "李四" }; //项目总监 BaseApproval director = new ProjectDirector { Name = "王五" }; pm.SetNext(charge); charge.SetNext(director); pm.Audit(context); if (context.AuditStatus) { Console.WriteLine("请假成功"); } else { Console.WriteLine("请假失败"); } Console.ReadLine(); } }
运行效果:
总结:
责任链模式与状态模式相比,责任链模式中的各个对象并不指定其下一个处理的对象到底是谁,只有在客户端才设定某个类型的链条,请求发出后穿越链条,直到被某个职责类处理或者链条结束。设计思路是把各个业务逻辑判断封装到不同职责类,且携带下一个职责的对应引用,但不像状态模式那样需要明确知道这个引用指向谁,而是在环境类设置链接方式或者过程。使用时,向链的第一个子类的执行方法传递参数就可以。客户端去通过环境类调用责任链,全自动运转起来。
责任链与一般的对象封装相比更加的灵活,可以自由的对审批流程进行控制。当然并不是所有的情况都适合用这个模式,使用哪种模式需要视情况而定。
奕独客》原创,转载请保留文章出处。
本文链接:.net简单的审批责任链模式学习 [https://www.yiduk.com/学习分享/13.html]
版权声明:若无特殊注明,本文为《正文到此结束