责任链模式

以订单优惠结算金额为例:

  • UML图:

  • 代码实现:
/// <summary>
    /// 降价请求
    /// </summary>
    public class CutPriceRequest
    {
        public int Count { get; set; } //商品数

        public decimal Price { get; set; } //单价

        public decimal ShouldPayPrice { get; set; } //应该支付总金额
    }
/// <summary>
    /// 售卖处理
    /// </summary>
    public abstract class BaseSaleHandler
    {
        protected BaseSaleHandler NextSaleHandler = null;

        /// <summary>
        /// 设置下一级优惠
        /// </summary>
        /// <param name="nextSaleHandler"></param>
        public void SetNextSaleHandler(BaseSaleHandler nextSaleHandler)
        {
            this.NextSaleHandler = nextSaleHandler;
        }

        /// <summary>
        /// 获取优惠后的金额
        /// </summary>
        /// <param name="request">优惠的请求</param>
        /// <returns></returns>
        public abstract decimal CutPriceResult(CutPriceRequest request);

    }

 /// <summary>
    /// 打折,例如打9折
    /// </summary>
public class DiscountHandler : BaseSaleHandler
    {
        /// <summary>
        /// 折扣
        /// </summary>
        private decimal _discount { get; set; }

        public DiscountHandler(decimal discount)
        {
            _discount = discount;
        }

        public override decimal CutPriceResult(CutPriceRequest request)
        {
            request.ShouldPayPrice = request.Price * request.Count * _discount;

            if (NextSaleHandler != null)
            {
                return NextSaleHandler.CutPriceResult(request);
            }

            return request.ShouldPayPrice;
        }
    }

 /// <summary>
    /// 满送,例如:买一送一
    /// </summary>
    public class FullCountRedHandler : BaseSaleHandler
    {
        /// <summary>
        /// 满送的最低数量
        /// </summary>
        private int _fullCount { get; set; }

        public FullCountRedHandler(int fullCount)
        {
            _fullCount = fullCount;
        }

        public override decimal CutPriceResult(CutPriceRequest request)
        {
            if (request.Count >= _fullCount)
            {
                request.ShouldPayPrice -= request.Price;
            }

            if (NextSaleHandler != null)
            {
                return NextSaleHandler.CutPriceResult(request);
            }

            return request.ShouldPayPrice;
        }
    }

 /// <summary>
    /// 满金额减,例如:满100-10
    /// </summary>
    public class FullPriceRedHandler : BaseSaleHandler
    {
        /// <summary>
        /// 满减金额的最低值
        /// </summary>
        private decimal _fullPrice { get; set; }

        public FullPriceRedHandler(decimal fullPrice)
        {
            _fullPrice = fullPrice;
        }

        public override decimal CutPriceResult(CutPriceRequest request)
        {
            if (request.ShouldPayPrice >= _fullPrice)
            {
                request.ShouldPayPrice -= 10;
            }

            if (NextSaleHandler != null)
            {
                return NextSaleHandler.CutPriceResult(request);
            }

            return request.ShouldPayPrice;
        }
    }
 /// <summary>
    /// 销售处理管理
    /// </summary>
    public class SaleHandlerManage
    {
        public static BaseSaleHandler saleHandler;

        static SaleHandlerManage()
        {
            saleHandler = new DiscountHandler(0.8m);//打八折
            var fullCountRedHandler = new FullCountRedHandler(2);//满2送1
            var fullPriceRedHandler = new FullPriceRedHandler(100);//满100减10
            fullCountRedHandler.SetNextSaleHandler(fullPriceRedHandler);
            saleHandler.SetNextSaleHandler(fullCountRedHandler);
        }

        private SaleHandlerManage()
        {

        }
    }
  • 调用端代码:
 class Program
    {
        static void Main(string[] args)
        {
            
            var request1 = new CutPriceRequest
            {
                Price = 30,
                Count = 5
            };
            var result1 = SaleHandlerManage.saleHandler.CutPriceResult(request1);
            Console.WriteLine($"买了{request1.Count}件商品,单价为{request1.Price},最后优惠完总价为:{result1}");

            Console.WriteLine("*************************************************************************");

            var request2 = new CutPriceRequest
            {
                Price = 300,
                Count = 1
            };
            var result2 = SaleHandlerManage.saleHandler.CutPriceResult(request2);
            Console.WriteLine($"买了{request2.Count}件商品,单价为{request2.Price},最后优惠完总价为:{result2}");

            Console.WriteLine("*************************************************************************");

            var request3 = new CutPriceRequest
            {
                Price = 10,
                Count = 1
            };
            var result3 = SaleHandlerManage.saleHandler.CutPriceResult(request3);
            Console.WriteLine($"买了{request3.Count}件商品,单价为{request3.Price},最后优惠完总价为:{result3}");
            Console.Read();
        }
    }
  • 运行效果:

  • 总结

责任链模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

代码下载地址:https://pan.baidu.com/s/1LLbRBz6ruMgNOs-4z4XoQg    8ucc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值