当前位置: 首页 > news >正文

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; }#endregionpublic 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);}

 

 

 

 

 

 

http://www.lryc.cn/news/56484.html

相关文章:

  • layui实现请求前添加一个加载 loading 的效果,并在请求成功后关闭
  • iostat / sar 命令详解
  • 2023-04-06:拥抱Golang,优化FFmpeg音频编码器,探究encode_audio.c的内部结构。
  • 归排、计排深度理解
  • 设计原则(单一职责原则 开放封闭原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则)
  • 好像模拟了一个引力场
  • MySQL优化——Explain分析执行计划详解
  • xcode 14.3 file not found libarclite_iphoneos.a
  • 基于AI+数据驱动的慢查询索引推荐
  • 【ESP32】嵌入式FreeRtos--Task
  • 【操作系统】面试官都爱问的进程调度算法
  • Spring-Web spi机制解析
  • 数据结构|将链表中小于0的数全部放在大于0的数的前面
  • 分享106个ASP影音娱乐源码,总有一款适合您
  • win10 PyCharm Anaconda过程记录
  • Chrome扩展程序导出备份与本地导入浏览器
  • mysql常用运算符
  • PyTorch 深度学习框架:优雅而简洁的代码实现
  • 【SpringMVC】请求重定向和转发
  • Vue中@click的常见修饰符
  • 软件测试面试复盘:技术面没有难倒我,hr面被虐的体无完肤
  • vue实现鼠标移入移出事件+解决鼠标事件没有反应
  • 右键移动文件.cmd
  • web基础
  • 牛客网算法八股刷题系列(七)正则化(软间隔SVM再回首)
  • 开源即时通讯IM框架MobileIMSDK的微信小程序端开发快速入门
  • 【C++从0到1】11、C++中赋值运算
  • GaussDB数据库事务介绍
  • MYSQL——美团面试题
  • Python 小型项目大全 16~20