using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Geovin.Du.DuChainOfResponsibility.DuPurchaseApproval.Common { /// <summary> /// 責任鏈模式Chain of Responsibility Pattern 亦稱: 職責鏈模式、命令鏈、CoR、Chain of Command、Chain of Responsibility /// 採購 /// </summary> public abstract class Approver { /// <summary> /// /// </summary> protected Approver? Next { get; private set; } /// <summary> /// /// </summary> /// <param name="next"></param> /// <returns></returns> public Approver RegisterNext(Approver next) { Next = next; return Next; } /// <summary> /// /// </summary> /// <param name="purchase"></param> public abstract void Approve(Purchase purchase); } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Geovin.Du.DuChainOfResponsibility.DuPurchaseApproval.Common { /// <summary> /// 責任鏈模式Chain of Responsibility Pattern 亦稱: 職責鏈模式、命令鏈、CoR、Chain of Command、Chain of Responsibility /// 審批 /// </summary> public class Purchase { /// <summary> /// 數量 /// </summary> public int Number { get; set; } /// <summary> /// 費用 ///</summary> public decimal Cost { get; set; } /// <summary> /// 審批 /// </summary> public string Purpose { get; set; } = string.Empty; } } using Geovin.Du.DuChainOfResponsibility.DuPurchaseApproval.Common; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.Net.Mime.MediaTypeNames; namespace Geovin.Du.DuChainOfResponsibility.DuPurchaseApproval.Handlers { /// <summary> /// 責任鏈模式Chain of Responsibility Pattern 亦稱: 職責鏈模式、命令鏈、CoR、Chain of Command、Chain of Responsibility /// </summary> public class Director : Approver { /// <summary> /// /// </summary> /// <param name="purchase"></param> public override void Approve(Purchase purchase) { if (purchase.Cost < 1000) { Console.WriteLine($"董事批准了這筆購買 #{purchase.Number} 這成本 {purchase.Cost:C}"); return; } Next?.Approve(purchase); } } } using Geovin.Du.DuChainOfResponsibility.DuPurchaseApproval.Common; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Geovin.Du.DuChainOfResponsibility.DuPurchaseApproval.Handlers { /// <summary> /// 責任鏈模式Chain of Responsibility Pattern 亦稱: 職責鏈模式、命令鏈、CoR、Chain of Command、Chain of Responsibility /// </summary> public class ExecutiveMeeting : Approver { /// <summary> /// /// </summary> public static readonly ExecutiveMeeting Instance = new(); /// <summary> /// /// </summary> private ExecutiveMeeting() { } /// <summary> /// /// </summary> /// <param name="purchase"></param> public override void Approve(Purchase purchase) => Console.WriteLine( $"這次採購#{purchase.Number} 成本是 {purchase.Cost:C} " + "需要召開一次行政會議才能得到批准."); } } using Geovin.Du.DuChainOfResponsibility.DuPurchaseApproval.Common; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.Net.Mime.MediaTypeNames; namespace Geovin.Du.DuChainOfResponsibility.DuPurchaseApproval.Handlers { /// <summary> /// 責任鏈模式Chain of Responsibility Pattern 亦稱: 職責鏈模式、命令鏈、CoR、Chain of Command、Chain of Responsibility /// </summary> public class Manager : Approver { /// <summary> /// /// </summary> /// <param name="purchase"></param> public override void Approve(Purchase purchase) { if (purchase.Cost < 500) { Console.WriteLine($"經理批准了這筆購買 #{purchase.Number} 成本是 {purchase.Cost:C}"); return; } Next?.Approve(purchase); } } } using Geovin.Du.DuChainOfResponsibility.DuPurchaseApproval.Common; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.Net.Mime.MediaTypeNames; namespace Geovin.Du.DuChainOfResponsibility.DuPurchaseApproval.Handlers { /// <summary> /// 責任鏈模式Chain of Responsibility Pattern 亦稱: 職責鏈模式、命令鏈、CoR、Chain of Command、Chain of Responsibility /// </summary> public class President : Approver { /// <summary> /// /// </summary> /// <param name="purchase"></param> public override void Approve(Purchase purchase) { if (purchase.Cost < 5000) { Console.WriteLine($"董事長批准了購買 #{purchase.Number} 成本是 {purchase.Cost:C}"); return; } Next?.Approve(purchase); } } } using Geovin.Du.DuChainOfResponsibility.DuPurchaseApproval.Common; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.Net.Mime.MediaTypeNames; namespace Geovin.Du.DuChainOfResponsibility.DuPurchaseApproval.Handlers { /// <summary> /// 責任鏈模式Chain of Responsibility Pattern 亦稱: 職責鏈模式、命令鏈、CoR、Chain of Command、Chain of Responsibility /// </summary> public class VicePresident : Approver { /// <summary> /// /// </summary> /// <param name="purchase"></param> public override void Approve(Purchase purchase) { if (purchase.Cost < 2000) { Console.WriteLine($"副董事長批准了這次購買 #{purchase.Number} 成本是 {purchase.Cost:C}"); return; } Next?.Approve(purchase); } } } using Geovin.Du.DuChainOfResponsibility.DuPurchaseApproval.Common; using Geovin.Du.DuChainOfResponsibility.DuPurchaseApproval.Handlers; using Geovin.Du.BuildingBlocks; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Geovin.Du.DuChainOfResponsibility.DuPurchaseApproval { /// <summary> /// 責任鏈模式Chain of Responsibility Pattern 亦稱: 職責鏈模式、命令鏈、CoR、Chain of Command、Chain of Responsibility /// </summary> public static class PurchaseApprovalExecutor { /// <summary> /// /// </summary> public static void Execute() { ConsoleExtension.WriteSeparator("責任鏈模式Chain of Responsibility Pattern--Purchase approval demo"); Approver manager = new Manager(); Approver director = new Director(); Approver vicePresident = new VicePresident(); Approver president = new President(); manager .RegisterNext(director) .RegisterNext(vicePresident) .RegisterNext(president) .RegisterNext(ExecutiveMeeting.Instance); var lowCostPurchase = new Purchase { Number = 1, Cost = 400, Purpose = "白板上購買." }; var mediumCostPurchase = new Purchase { Number = 2, Cost = 3000, Purpose = "筆記本電腦購買e." }; var highCostPurchase = new Purchase { Number = 3, Cost = 11500, Purpose = "汽車的購買." }; manager.Approve(lowCostPurchase); manager.Approve(mediumCostPurchase); manager.Approve(highCostPurchase); } } }
調用:
Geovin.Du.DuChainOfResponsibility.DuPurchaseApproval.PurchaseApprovalExecutor.Execute();
輸出:、
Hello, Geovin Du! 學習 .net 6 責任鏈模式Chain of Responsibility Pattern--Purchase approval demo -------------------------------------------------- 經理批准了這筆購買 #1 成本是 ¥400.00 董事長批准了購買 #2 成本是 ¥3,000.00 這次採購#3 成本是 ¥11,500.00 需要召開一次行政會議才能得到批准.