设计模式行为型之责任链模式

定义

将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能将请求传递给链上的下一个对象。

模拟场景

公司请假审批流程:

  • 如果请假天数小于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);
            }

        }
    }

 

代码实现

一个简单的责任链模式就实现 了,具体业务中,子类中可以灵活配置,符合开闭原则。

posted @ 2020-09-04 22:32  一叶青城  阅读(136)  评论(0编辑  收藏  举报