public override void Audit(ApplyContext context) { Console.WriteLine($"请求有{base.AuditerName} 审核"); if (context.Hour <= 16) { context.AuditResult = true; context.AuditRemark = "去享受你的假期吧"; } else { //AbstractAuditer charge = new Manager() { // AuditerName = "Manager" //}; //charge.Audit(context); base.AuditNext(context); } }
public override void Audit(ApplyContext context) { Console.WriteLine($"请求有{base.AuditerName} 审核"); if (context.Hour <= 24) { context.AuditResult = true; context.AuditRemark = "去享受你的假期吧"; } else { //AbstractAuditer chief = new Chief() //{ // AuditerName = "Chief" //}; //chief.Audit(context); base.AuditNext(context); } }
/// <summary> /// 下一级审核,放在父类里面,继承的子类也就都可以拥有 /// </summary> /// <param name="context"></param> protected void AuditNext(ApplyContext context) { nextAuditer?.Audit(context); }
public abstract void Audit(ApplyContext context);
static void Main(string[] args) { /*场景:请假审批流程 * PM(项目组长审核8小时的)-->Charge主管审核16-->Manager(经理审核24小时)-->Chief(总监审核32) */ ApplyContext context = new ApplyContext() { Id = 1, Name = "张三", Hour = 32, Description = "我想回家", AuditResult = false, AuditRemark = "" }; { //下面的写法直白明了,是面向过程变成(POP); //缺点:暴露业务的细节,而且毫无技术含量,代码翻译机 //if (context.Hour < 8) //{ // Console.WriteLine("PM审核通过该"); //} //else if (context.Hour < 16) //{ // Console.WriteLine("主管审核通过该"); //} //else //{ // Console.WriteLine("******************"); //} } { /*责任链模式实现,第一次封装*/ //Console.WriteLine("责任链模式实现,第一次封装"); //AbstractAuditer pm = new PM(); //pm.Audit(context); //if (!context.AuditResult) //{ // AbstractAuditer charge = new Charge(); // charge.Audit(context); // if (!context.AuditResult) // { // //未完待续 // } //} } { /*责任链模式实现,第二次封装,在角色审核方法里面添加else 后自动转给下一个角色进行审核*/ //Console.WriteLine("责任链模式实现,第二次封装"); //AbstractAuditer pm = new PM() //{ // AuditerName = "PM" //}; //pm.Audit(context); //bool result = context.AuditResult; } { /* * 上面的方式已经是oop的实现方式,但是也有很大的问题,就是下一级在类里面写死了,如果流程变了则要改动类 * 怎么样保证代码的稳定的性呢? 把不稳定的部分甩出去,甩锅大法 * 代码再改动下,在虚拟父类里面添加设置下一个审批人的方法,然后改动每个子类实现该方法 */ AbstractAuditer pm = new PM() { AuditerName = "PM" }; AbstractAuditer charge = new Charge() { AuditerName = "Charge" }; AbstractAuditer manager = new Manager() { AuditerName = "Manager" }; AbstractAuditer chief = new Chief() { AuditerName = "Chief" }; //设置下一级 pm.SerNext(charge); charge.SerNext(manager); manager.SerNext(chief); //开始审核 pm.Audit(context); bool result = context.AuditResult; Console.WriteLine($"result:{result}"); } }