设计模式行为型之责任链模式
定义
将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能将请求传递给链上的下一个对象。
模拟场景
公司请假审批流程:
- 如果请假天数小于3天,项目经理审批
- 如果请假天数大于等于3天,小于10天,部门经理审批
- 如果请假天数大于等于10天,小于30天,CEO审批
- 如果请假天数大于等于30天,提示拒绝
代码实现
1.定义请假条对象
/// <summary> /// 请假条对象 /// </summary> public class ApplyContext { /// <summary> /// 员工姓名 /// </summary> public string EmpName { get; set; } /// <summary> /// 请假天数 /// </summary> public int Days { get; set; } /// <summary> /// 请假理由 /// </summary> public string Reason { get; set; } }
2.定义一个抽象领导处理类
/// <summary> /// 审核抽象类 /// </summary> public abstract class LeaderAbstract { /// <summary> /// 领导名子 /// </summary> public string LeaderName { get; set; } /// <summary> /// 下级审核人 /// </summary> protected LeaderAbstract NextAuditUser = null; public void SetNextAuditUser(LeaderAbstract leader) { this.NextAuditUser = leader; } /// <summary> /// 审核方法 /// </summary> public abstract void Audit(ApplyContext applyContext); }
3.每级领导按照自己的职责完成父类方法
/// <summary> /// 项目经理处理类 /// </summary> public class PM : LeaderAbstract { public override void Audit(ApplyContext applyContext) { //判断:有能力处理则处理之,否则有后继者则将请求传递给后继者 if (applyContext.Days < 3) { Console.WriteLine($"员工{applyContext.EmpName},请假{applyContext.Days}天,理由:{applyContext.Reason}"); Console.WriteLine($"项目经理:{this.LeaderName}-审核通过"); } else { if (this.NextAuditUser != null) { this.NextAuditUser.Audit(applyContext); } } } }
/// <summary> /// 部门经理处理类 /// </summary> public class Manager: LeaderAbstract { public override void Audit(ApplyContext applyContext) { //判断:有能力处理则处理之,否则有后继者则将请求传递给后继者 if (applyContext.Days < 10) { Console.WriteLine($"员工{applyContext.EmpName},请假{applyContext.Days}天,理由:{applyContext.Reason}"); Console.WriteLine($"项目经理:{this.LeaderName}-审核通过"); } else { if (this.NextAuditUser != null) { this.NextAuditUser.Audit(applyContext); } } } }
/// <summary> /// CEO处理类 /// </summary> public class CEO: LeaderAbstract { public override void Audit(ApplyContext applyContext) { //判断:有能力处理则处理之,否则有后继者则将请求传递给后继者 if (applyContext.Days < 30) { Console.WriteLine($"员工{applyContext.EmpName},请假{applyContext.Days}天,理由:{applyContext.Reason}"); Console.WriteLine($"项目经理:{this.LeaderName}-审核通过"); } else { Console.WriteLine("是不是不想干了,请假这么多天,审批拒绝"); } } }
测试代码和结果如下:
class Program { static void Main(string[] args) { //定义各级领导 LeaderAbstract pm = new PM() { LeaderName = "JERRY" }; LeaderAbstract manager = new Manager() { LeaderName = "TOM" }; LeaderAbstract ceo = new CEO() { LeaderName = "STAR" }; //设置下级审核人/责任链关系 pm.SetNextAuditUser(manager); manager.SetNextAuditUser(ceo); Console.WriteLine("-----------------------------"); { //请假业务 ApplyContext context = new ApplyContext() { EmpName = "小强", Days = 31, Reason = "世界那么大,我想去看看" }; //先交由项目经理审核 pm.Audit(context); } Console.WriteLine("-----------------------------"); { //请假业务 ApplyContext context = new ApplyContext() { EmpName = "小红", Days = 2, Reason = "世界那么大,我想去看看" }; //先交由项目经理审核 pm.Audit(context); } } }
代码实现
一个简单的责任链模式就实现 了,具体业务中,子类中可以灵活配置,符合开闭原则。