以订单优惠结算金额为例:
- 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