CSharp: Chain of Responsibility Pattern in donet core 6

 

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  需要召開一次行政會議才能得到批准.

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章