Пример #1
0
        /// <summary>
        /// 责任链模式:
        /// 在日常生活中,我们经常见到一种情况,就是不同的情况需要不同的对待
        ///
        /// 例如:
        /// 你需要请假,提交了请假申请后,
        /// 如果你请假时间是1-3天,你的部门主管同意就可以了,
        /// 如果你请假时间是3-7天,那你的部门主管同意后还不行,还需要你的部门总监同意才可以,
        /// 如果你请假时间大于7天,那你的部门主管和部门总监同意都还不行,必须需要老板同意才可以
        /// 上面的这种模式,就是一个很明显的责任链模式
        ///
        /// 当然我们最基础的实现, 就是使用if else不停的去判断,
        /// 这样会导致后期很难维护,并且每个模块之间的耦合性太高,使得程序没有扩展性
        ///
        /// 使用责任链模式,就可以进行解耦,并且还易于扩展
        ///
        /// 当然责任链模式也不是说没有缺点:
        /// 缺点就是导致可能会有性能的问题,还有就是有可能请求不会被处理(这个很少见)
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //初始化请假申请
            LeaveApply apply1 = new LeaveApply("张三", 1);
            LeaveApply apply2 = new LeaveApply("小明", 5);
            LeaveApply apply3 = new LeaveApply("王五", 10);
            LeaveApply apply4 = new LeaveApply("王五", 15);
            //初始化审批人
            Approver deptManager   = new DeptManager("部门主管");
            Approver deptInspector = new DeptInspector("部门总监");
            Approver boss          = new Boss("老板");

            Console.WriteLine("-------------------------------------------------");
            //设置责任链
            deptManager.NextApprover   = deptInspector;
            deptInspector.NextApprover = boss;

            Console.WriteLine("-------------------------------------------------");
            //开始审批
            deptManager.ApproveApply(apply1);
            Console.WriteLine("-------------------------------------------------");
            deptManager.ApproveApply(apply2);
            Console.WriteLine("-------------------------------------------------");
            deptManager.ApproveApply(apply3);
            Console.WriteLine("-------------------------------------------------");
            deptManager.ApproveApply(apply4);

            Console.ReadKey();
        }
        public override void ApproveApply(LeaveApply leaveApply)
        {
            var record = new ApproverRecord(this);

            leaveApply.ApproverRecords.Add(record);
            if (leaveApply.ApplyDays < 15)
            {
                record.Result            = true;
                leaveApply.ApproveResult = true;
                Console.WriteLine("{0}的请假时间小于15天,我审批通过,审批结束!", leaveApply.ApplyUserName);
            }
            else
            {
                Console.WriteLine("{0}请假时长超过15天,公司需要开会讨论下才能给出审批结果!", leaveApply.ApplyUserName);
            }
        }
        public override void ApproveApply(LeaveApply leaveApply)
        {
            var record = new ApproverRecord(this);

            leaveApply.ApproverRecords.Add(record);
            if (leaveApply.ApplyDays < 7)
            {
                record.Result            = true;
                leaveApply.ApproveResult = true;
                Console.WriteLine("{0}的请假时间小于7天,我审批通过,审批结束!", leaveApply.ApplyUserName);
            }
            else
            {
                Console.WriteLine("{0}的请假时间超过7天,我审批通过,接下来交给{1}审批!", leaveApply.ApplyUserName, this.NextApprover.ApproveName);
                this.NextApprover.ApproveApply(leaveApply);
            }
        }
 /// <summary>
 /// 审批的方法,不同实现类责任不同,所以交给实现类去实现
 /// </summary>
 /// <param name="leaveApply"></param>
 public abstract void ApproveApply(LeaveApply leaveApply);