编辑
2025-09-28
C#
00

目录

摘要
正文
结构
示例

摘要

职责链模式是一种行为型设计模式,它允许多个对象按照顺序处理请求,直到其中一个对象能够处理为止。每个对象都可以选择将请求传递给下一个对象,也可以选择自行处理请求。

正文

结构

职责链模式由以下几个角色组成:

  • 抽象处理者(Handler):定义一个处理请求的接口,并且保存下一个处理者的引用。
  • 具体处理者(ConcreteHandler):实现抽象处理者接口,处理请求,如果自己无法处理,则将请求传递给下一个处理者。
  • 客户端(Client):创建处理者对象,并将请求发送给第一个处理者。

示例

假设我们正在开发一个电商平台,我们需要实现一个优惠券系统。系统中有多种类型的优惠券,例如满减券、折扣券和免运费券。当用户下单时,系统需要根据用户的购买金额和优惠券类型来计算最终的支付金额。

我们可以使用职责链模式来实现这个优惠券系统。首先,我们定义一个抽象处理者接口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); } } }

接下来,我们创建具体处理者类FullReductionCouponHandlerDiscountCouponHandlerFreeShippingCouponHandler,分别处理满减券、折扣券和免运费券:

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}"); }

image.png

以上是关于职责链模式的示例代码,通过使用职责链模式,我们可以将处理请求的逻辑拆分成多个处理者,并按照一定的顺序来处理请求。职责链模式可以用于各种场景,例如审批流程、事件处理等。希望本文对你理解职责链模式有所帮助。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!