职责链模式是一种行为型设计模式,它允许多个对象按照顺序处理请求,直到其中一个对象能够处理为止。每个对象都可以选择将请求传递给下一个对象,也可以选择自行处理请求。
职责链模式由以下几个角色组成:
假设我们正在开发一个电商平台,我们需要实现一个优惠券系统。系统中有多种类型的优惠券,例如满减券、折扣券和免运费券。当用户下单时,系统需要根据用户的购买金额和优惠券类型来计算最终的支付金额。
我们可以使用职责链模式来实现这个优惠券系统。首先,我们定义一个抽象处理者接口ICouponHandler
,该接口包含一个处理请求的方法HandleCoupon
和一个设置下一个处理者的方法SetNextHandler
:
C#public class Order
{
public double TotalAmount { get; }
public CouponType CouponType { get; }
public string CouponName { get; private set; }
public double Discount { get; private set; }
public Order(double totalAmount, CouponType couponType)
{
TotalAmount = totalAmount;
CouponType = couponType;
}
public void ApplyCoupon(string couponName, double discount)
{
CouponName = couponName;
Discount = discount;
}
}
public enum CouponType
{
FullReduction,
Discount,
FreeShipping
}
C#public interface ICouponHandler
{
void HandleCoupon(Order order);
void SetNextHandler(ICouponHandler nextHandler);
}
然后,我们创建具体处理者类BaseCouponHandler
,实现抽象处理者接口,并提供一个默认的处理方法:
C#public abstract class BaseCouponHandler : ICouponHandler
{
private ICouponHandler _nextHandler;
public void SetNextHandler(ICouponHandler nextHandler)
{
_nextHandler = nextHandler;
}
public virtual void HandleCoupon(Order order)
{
if (_nextHandler != null)
{
_nextHandler.HandleCoupon(order);
}
}
}
接下来,我们创建具体处理者类FullReductionCouponHandler
、DiscountCouponHandler
和FreeShippingCouponHandler
,分别处理满减券、折扣券和免运费券:
C#public class FullReductionCouponHandler : BaseCouponHandler
{
public override void HandleCoupon(Order order)
{
if (order.TotalAmount >= 100)
{
order.ApplyCoupon("满减券", 10);
}
base.HandleCoupon(order);
}
}
public class DiscountCouponHandler : BaseCouponHandler
{
public override void HandleCoupon(Order order)
{
if (order.CouponType == CouponType.Discount)
{
order.ApplyCoupon("折扣券", 0.8);
}
base.HandleCoupon(order);
}
}
public class FreeShippingCouponHandler : BaseCouponHandler
{
public override void HandleCoupon(Order order)
{
if (order.CouponType == CouponType.FreeShipping)
{
order.ApplyCoupon("免运费券", 0);
}
base.HandleCoupon(order);
}
}
我们可以在客户端代码中使用职责链模式来处理优惠券:
C#static void Main(string[] args)
{
var order = new Order(150, CouponType.Discount);
var fullReductionHandler = new FullReductionCouponHandler();
var discountHandler = new DiscountCouponHandler();
var freeShippingHandler = new FreeShippingCouponHandler();
fullReductionHandler.SetNextHandler(discountHandler);
discountHandler.SetNextHandler(freeShippingHandler);
fullReductionHandler.HandleCoupon(order);
Console.WriteLine($"Total amount: {order.TotalAmount}, Coupon: {order.CouponName}, Discount: {order.Discount}");
}
以上是关于职责链模式的示例代码,通过使用职责链模式,我们可以将处理请求的逻辑拆分成多个处理者,并按照一定的顺序来处理请求。职责链模式可以用于各种场景,例如审批流程、事件处理等。希望本文对你理解职责链模式有所帮助。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!