C# 行为型模式之责任链模式

文章介绍了责任链模式在请求处理中的应用,以公司采购审批为例,展示了如何通过责任链模式将不同级别的审批者(经理、副总、总经理)串联起来,当请求从链中传递,由相应权限的审批者处理。代码示例中,采购请求根据金额大小由不同的审批者批准,超过一定金额则需更高层级审批或召开会议讨论。

责任链模式:请求从链中的一个对象传递到下一个对象,直到请求被响应为止。通过这种方式在对象之间去除耦合。

用途:请假审批、采购审批等。

案例介绍:以公司采购东西为例子来实现责任链模式。公司规定,采购架构总价在1万之内,经理级别的人批准即可,总价大于1万小于2万5的则还需要副总进行批准,总价大于2万5小于10万的需要还需要总经理批准,而大于总价大于10万的则需要组织一个会议进行讨论

审批类: 

    /// <summary>
    /// 审批实体类
    /// </summary>
    internal class Approver
    {
        #region 数据库对应字段
        /// <summary>
        /// 用户Id
        /// </summary>
        public string UId { get; set; }
        /// <summary>
        /// 用户名
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 下一个审批Id
        /// </summary>
        public string NextApproverId { get; set; }
        /// <summary>
        /// 当前最多审批的金额
        /// </summary>
        public int Amount { get; set; }
        #endregion

        public Approver NextApprover { get;private set; }
        void GetNextApprover()
        {
            if (!string.IsNullOrWhiteSpace(NextApproverId))
            {
                // 查找数据库
                NextApprover = TestData.GetDataWithUId(NextApproverId);
            }
        }
        public virtual void ProcessRequest(PurchaseRequest request)
        {
            GetNextApprover();
            if (request.Amount <= Amount)
            {
                Console.WriteLine($"[{Name}] 批准了购买 [{request.ProductName}] 的请求");
            }
            else
            {
                if (NextApprover == null)
                    Console.WriteLine($"需要开会讨论购买 [{request.ProductName}]");
            }
            if (NextApprover != null)
            {
                NextApprover.ProcessRequest(request);
            }
        }
    }

 采购类:

    /// <summary>
    /// 采购请求
    /// </summary>
    internal class PurchaseRequest
    {
        // 金额
        public double Amount { get; set; }
        // 产品名字
        public string ProductName { get; set; }
        public PurchaseRequest(double amount, string productName)
        {
            Amount = amount;
            ProductName = productName;
        }
    }

测试数据:

internal class TestData
    {
        static List<Approver> approvers;
        static TestData()
        {
            approvers = new List<Approver>(3);
            Approver approver1 = new Approver()
            {
                UId = Guid.NewGuid().ToString(),
                Name = "王总",
                Amount = 100000
            };
            Approver approver2 = new Approver()
            {
                UId = Guid.NewGuid().ToString(),
                Name = "李副总",
                NextApproverId = approver1.UId,
                Amount = 25000
            };
            Approver approver3 = new Approver()
            {
                UId = Guid.NewGuid().ToString(),
                Name = "孙经理",
                NextApproverId = approver2.UId,
                Amount = 10000
            };
            approvers.Add(approver1);
            approvers.Add(approver2);
            approvers.Add(approver3);
        }
        internal static List<Approver> GetDatas()
        {
            return approvers;
        }
        internal static List<Approver> GetDatas(Func<Approver, bool> func)
        {
            return approvers.Where(func).ToList();
        }
        internal static Approver GetDataWithUId(string uid)
        {
            return GetData((t) => t.UId == uid);
        }
        internal static Approver GetData(Func<Approver, bool> func)
        {
            return approvers.FirstOrDefault(func);
        }
    }

测试用例:

public static void Test()
        {
            // 商品类
            PurchaseRequest purchase = new PurchaseRequest(20000,"电脑");
            PurchaseRequest purchase2 = new PurchaseRequest(2000, "笔");
            PurchaseRequest purchase3 = new PurchaseRequest(30000, "手机");
            PurchaseRequest purchase4 = new PurchaseRequest(110000, "3台电脑");

            // 需要审批的商品
            PurchaseRequest NeedPurchase = purchase4;
            // 根据金额筛选出权限最低的人
            var firstData = TestData.GetDatas().Where(t=>t.Amount>= NeedPurchase.Amount).OrderBy(t => t.Amount).FirstOrDefault();
            if (firstData == null)
                firstData = TestData.GetDatas().OrderByDescending(t => t.Amount).LastOrDefault();
            // 开始审批
            firstData.ProcessRequest(NeedPurchase);
           
        }

 

 

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值