设计模式-责任链设计模式
时间:2019-09-19
本文章向大家介绍设计模式-责任链设计模式,主要包括设计模式-责任链设计模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
责任链设计模式,是行为型设计模式的巅峰之作。
现在有一个场景,请假申请。请假时间的长短,需要不同级别的领导才能审批。
万物皆对象嘛,请假需要工号、姓名、原因、时长、结果等等,那我们来定义一个请假的类。其实其就是一个上下文环境(Context),保存业务处理中参数-----中间结果-----最终结果。行为型设计模式重用的标配,把行为转移。
public class ApplyContext { public int Id { get; set; } public string Name { get; set; } /// <summary> /// 请假时长 /// </summary> public int Hour { get; set; } public string Description { get; set; } public bool AuditResult { get; set; } public string AuditRemark { get; set; } }
请假需要new一个实例:
ApplyContext context = new ApplyContext() { Id = 506, Name = "bingle", Hour = 100, Description = "世界那么大,我想去看看!", AuditResult = false, AuditRemark = "" };
第一种方式,审批逻辑都卸载上端,直接就是需求翻译,没有任何加工,谈不上什么扩展,面向国产:
if (context.Hour <= 8) { Console.WriteLine("PM审批通过"); } else if (context.Hour <= 16) { Console.WriteLine("主管审批通过"); } else { Console.WriteLine("************"); }
第二种方式,面向对象:封装--继承--多态,转移业务逻辑,也只是一个翻译机,翻译完+面向对象,其实完全没有涉及加工没有思考。
领导类S:
public class PM { public override void Audit(ApplyContext context) { Console.WriteLine($"This is {this.GetType().Name} {this.Name} Audit"); if (context.Hour <= 8) { context.AuditResult = true; context.AuditRemark = "允许请假!"; } } } public class Charge { public override void Audit(ApplyContext context) { Console.WriteLine($"This is {this.GetType().Name} {this.Name} Audit"); if (context.Hour <= 16) { context.AuditResult = true; context.AuditRemark = "允许请假!"; } } } public class Manager { public override void Audit(ApplyContext context) { Console.WriteLine($"This is {this.GetType().Name} {this.Name} Audit"); if (context.Hour <= 24) { context.AuditResult = true; context.AuditRemark = "允许请假!"; } } } public class Chief { public override void Audit(ApplyContext context) { Console.WriteLine($"This is {this.GetType().Name} {this.Name} Audit"); if (context.Hour <= 48) { context.AuditResult = true; context.AuditRemark = "允许请假!"; } } } public class CEO : AbstractAuditor { public override void Audit(ApplyContext context) { Console.WriteLine($"This is {this.GetType().Name} {this.Name} Audit"); if (context.Hour <= 96) { context.AuditResult = true; context.AuditRemark = "允许请假!"; } } } public class ChiarMan : AbstractAuditor { public override void Audit(ApplyContext context) { Console.WriteLine($"This is {this.GetType().Name} {this.Name} Audit"); if (context.Hour <= 1000000) { context.AuditResult = true; context.AuditRemark = "允许请假!"; } } }
下面进行逻辑的翻译:
AbstractAuditor pm = new PM() { Name = "bingle1" }; pm.Audit(context); if (!context.AuditResult) { AbstractAuditor charge = new Charge() { Name = "bingle2" }; charge.Audit(context); if (!context.AuditResult) { AbstractAuditor manager = new Manager() { Name = "bingle3" }; manager.Audit(context); if (!context.AuditResult) { //找下一环节 } } }
不要直接翻译的逻辑,需要涉及,现在的场景分析是,1、权限范围内,审批通过;2、权限范围外,交给下一环节审批,写的代码又多了一个,指定洗衣环节,甩锅大法开始。
首先定义一个抽象父类:
public abstract class AbstractAuditor { public string Name { get; set; } public abstract void Audit(ApplyContext context); private AbstractAuditor _NextAuditor = null; public void SetNext(AbstractAuditor auditor) { this._NextAuditor = auditor; } protected void AuditNext(ApplyContext context) { if (this._NextAuditor != null) { this._NextAuditor.Audit(context); } else { context.AuditResult = false; context.AuditRemark = "不允许请假!"; } } }
领导类需要继承这个抽象类:
public class PM : AbstractAuditor { public override void Audit(ApplyContext context) { Console.WriteLine($"This is {this.GetType().Name} {this.Name} Audit"); if (context.Hour <= 8) { context.AuditResult = true; context.AuditRemark = "允许请假!"; } else { AbstractAuditor charge = new Charge() { Name = "象扑君" }; charge.Audit(context); } } }
其他的领导类以此类推.....
调用的时候,只需要找最低权限的人,去审批
AbstractAuditor pm = new PM() { Name = "bingle" }; pm.Audit(context);
以上,转移了申请提交的逻辑,这次符合实际情况,有了自己的思考和设计在里面。
甩锅大法开始了,一样,领导类需要实现抽象父类,不过在Audit方法中稍作了改动
public class PM : AbstractAuditor { public override void Audit(ApplyContext context) { Console.WriteLine($"This is {this.GetType().Name} {this.Name} Audit"); if (context.Hour <= 8) { context.AuditResult = true; context.AuditRemark = "允许请假!"; } else { base.AuditNext(context); } } } public class Manager : AbstractAuditor { public override void Audit(ApplyContext context) { Console.WriteLine($"This is {this.GetType().Name} {this.Name} Audit"); if (context.Hour <= 24) { context.AuditResult = true; context.AuditRemark = "允许请假!"; } else { base.AuditNext(context); } } } public class Chief : AbstractAuditor { public override void Audit(ApplyContext context) { Console.WriteLine($"This is {this.GetType().Name} {this.Name} Audit"); if (context.Hour <= 48) { context.AuditResult = true; context.AuditRemark = "允许请假!"; } else { base.AuditNext(context); } } } public class ChiarMan : AbstractAuditor { public override void Audit(ApplyContext context) { Console.WriteLine($"This is {this.GetType().Name} {this.Name} Audit"); if (context.Hour <= 1000000) { context.AuditResult = true; context.AuditRemark = "允许请假!"; } else { base.AuditNext(context); } } } public class Charge: AbstractAuditor { public override void Audit(ApplyContext context) { Console.WriteLine($"This is {this.GetType().Name} {this.Name} Audit"); if (context.Hour <= 16) { context.AuditResult = true; context.AuditRemark = "允许请假!"; } else { base.AuditNext(context); } } } public class CEO : AbstractAuditor { public override void Audit(ApplyContext context) { Console.WriteLine($"This is {this.GetType().Name} {this.Name} Audit"); if (context.Hour <= 96) { context.AuditResult = true; context.AuditRemark = "允许请假!"; } else { base.AuditNext(context); } } }
下面需要找领导审批了:
AbstractAuditor pm = new PM() { Name = "bingle1" }; AbstractAuditor charge = new Charge() { Name = "bingle1" }; AbstractAuditor manager = new Manager() { Name = "bingle1" }; AbstractAuditor chief = new Chief() { Name = "bingle1" }; AbstractAuditor ceo = new CEO() { Name = "bingle1" }; //pm.SetNext(charge); //charge.SetNext(manager); pm.SetNext(manager); manager.SetNext(chief); chief.SetNext(ceo); ceo.SetNext(new ChiarMan() { Name = "bingle1" }); //流程的可扩展 pm.Audit(context); if (!context.AuditResult) { Console.WriteLine("不干了!"); }
以上,把流畅环节逻辑从业务类转移了。
原文地址:https://www.cnblogs.com/taotaozhuanyong/p/11552599.html
- JsBridge实现JavaScript和Java的互相调用
- JAVA-FTP批量大文件传输
- 独家 | 一文读懂TensorFlow(附代码、学习资料)
- 解决openssh漏洞,升级openssh版本
- 解决NTPD漏洞,升级Ntpd版本
- 独家 | 手把手教TensorFlow(附代码)
- HBase Region自动切分细节
- eclipse搭建ssh后台
- 解决mysql漏洞 Oracle MySQL Server远程安全漏洞(CVE-2015-0411)
- im4java包处理图片
- centOS7 mini配置linux服务器(五) 安装和配置tomcat和mysql
- RedisPool操作Redis,工具类实例
- centOS7 mini配置linux服务器(四) 配置jdk
- 老司机教你“飙”EventBus3
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Haproxy combined with FTP cluster for load balancing
- redis使用playbook批量安装
- SpringCloud Alibaba微服务实战十八 - Oauth2.0 自定义授权模式
- 包子旧闻&Leetcode solution 1344. Angle Between Hands of a Clock
- Ubuntu下DNS服务搭建
- 深入理解JavaScript函数式编程
- JavaScript 异步编程
- 日志清理脚本-V0.0.3(增加多目录清理、正则表达式匹配、调试模式;部分细节优化)
- Fastdfs高可用集群搭建
- Logstash:处理多个 input
- 一文学会哈希法解题
- 一小时彻底掌握stm32中断。
- Python 爬虫进阶必备 | 关于某虚拟币网站加密签名的分析(难度0.1)
- PHP中的数据库连接持久化
- ClickHouse王炸功能即将来袭?