首页 > 其他分享 >职责链模式

职责链模式

时间:2024-02-29 09:23:15浏览次数:21  
标签:责任 职责 处理 模式 发送者 退款 请求

简介

职责链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理它为止。这种模式允许多个对象都有机会处理请求,避免了发送者和接收者之间的耦合关系。

结构

  1. Handler(处理者):定义处理请求的接口,并维护一个后继处理者的引用。

  2. ConcreteHandler(具体处理者):实现处理请求的方法,如果可以处理请求则进行处理,否则将请求转发给后继处理者。

案例

我们考虑一个简单的电子商务系统中的退款处理流程。假设我们有以下角色和需求:

  1. 顾客:提交退款请求。
  2. 客服:负责审核退款请求,如果金额不超过一定限额,则可以直接处理;否则,将请求转发给经理。
  3. 经理:负责审核高额退款请求,如果同意,则处理退款;否则,将请求转发给财务部门。
  4. 财务部门:负责处理高额退款请求。

在这种情况下,我们可以使用责任链模式来处理不同级别的退款请求。

以下是使用 C# 实现责任链模式的示例代码:

using System;

// 请求类
class RefundRequest
{
    public double Amount { get; }

    public RefundRequest(double amount)
    {
        Amount = amount;
    }
}

// 处理者抽象类
abstract class RefundHandler
{
    protected RefundHandler Successor;

    public void SetSuccessor(RefundHandler successor)
    {
        Successor = successor;
    }

    public abstract void HandleRefund(RefundRequest request);
}

// 客服处理者
class CustomerService : RefundHandler
{
    public override void HandleRefund(RefundRequest request)
    {
        if (request.Amount <= 100)
        {
            Console.WriteLine("Customer service processed the refund.");
        }
        else if (Successor != null)
        {
            Successor.HandleRefund(request);
        }
    }
}

// 经理处理者
class Manager : RefundHandler
{
    public override void HandleRefund(RefundRequest request)
    {
        if (request.Amount <= 1000)
        {
            Console.WriteLine("Manager approved and processed the refund.");
        }
        else if (Successor != null)
        {
            Successor.HandleRefund(request);
        }
    }
}

// 财务部门处理者
class FinanceDepartment : RefundHandler
{
    public override void HandleRefund(RefundRequest request)
    {
        Console.WriteLine("Finance department processed the refund.");
    }
}

class Program
{
    static void Main(string[] args)
    {
        var customerService = new CustomerService();
        var manager = new Manager();
        var financeDepartment = new FinanceDepartment();

        // 设置处理者链
        customerService.SetSuccessor(manager);
        manager.SetSuccessor(financeDepartment);

        // 模拟退款请求
        var request1 = new RefundRequest(50);
        var request2 = new RefundRequest(500);
        var request3 = new RefundRequest(5000);

        customerService.HandleRefund(request1);
        customerService.HandleRefund(request2);
        customerService.HandleRefund(request3);
    }
}

在这个 C# 示例中,我们创建了 RefundRequest 类来表示退款请求,然后定义了抽象的处理者类 RefundHandler 和具体的处理者类 CustomerServiceManagerFinanceDepartment。主程序中创建了各个处理者并建立了处理者链,然后模拟了三个不同金额的退款请求。

其他案例

  1. ASP.NET Core Middleware Pipeline: ASP.NET Core 中的中间件管道就是一个很好的责任链模式的应用。每个中间件都可以处理请求,如果需要,可以选择终止请求处理或将请求传递给下一个中间件。

  2. 异常处理链: 在 .NET 中,可以构建一个异常处理链来处理异常。每个处理器负责处理一种特定类型的异常,如果自己无法处理,则将异常传递给下一个处理器。

  3. 事件处理机制: 在 .NET 中,事件处理机制也可以看作是一种责任链模式的应用。事件触发者并不知道具体的事件处理者,而是将事件发送给所有注册的处理器,直到找到合适的处理器处理事件。

  4. 消息处理系统: 在消息驱动的系统中,可以使用责任链模式来处理消息。每个处理者负责处理一种类型的消息,如果自己无法处理,则将消息传递给下一个处理者。

优点

  1. 降低耦合度: 责任链模式将请求发送者和接收者解耦,请求者无需知道是谁处理了请求,处理者也无需知道请求的全貌,从而降低了对象之间的耦合度。

  2. 灵活性和可扩展性: 可以很容易地增加新的处理者或者修改处理者的顺序,以适应不同的需求和场景,使系统更加灵活可扩展。

  3. 单一职责原则: 每个具体处理者都只关注自己的业务逻辑,符合单一职责原则,易于维护和理解。

  4. 动态性: 可以动态地调整处理链,使得处理顺序和处理者可以根据运行时条件而变化。

缺点

  1. 请求无法保证被处理: 由于请求可能到达链的末端仍然没有被处理,如果没有设置默认的处理者或者处理者链太长,可能导致请求无法被处理。

  2. 性能问题: 处理者链过长或者处理者之间存在循环引用可能会导致性能问题,因为请求需要在整个链中传递,直到找到合适的处理者。

  3. 调试困难: 由于请求的处理流程是由一系列处理者决定的,当出现问题时,可能需要逐个调试每个处理者,不利于排查问题。

  4. 可能导致滥用: 如果责任链过于复杂或者层级过深,可能会导致代码难以理解和维护,不适合所有场景。

适用场景

  1. 请求的发送者和接收者之间的关系不确定或者不明确: 当发送者无法明确知道请求应该由哪个接收者处理时,可以使用责任链模式。责任链模式可以动态地确定请求的处理者,而不需要发送者了解整个处理流程。

  2. 多个对象可以处理同一请求: 当一个请求可以被多个对象处理时,但发送者只需要知道请求会被处理即可,而不需要关心是哪个对象处理的时候,责任链模式是一个很好的选择。

  3. 需要动态指定处理流程: 当处理流程需要根据运行时条件动态确定时,可以使用责任链模式。责任链模式允许灵活地调整处理链,根据需要动态地添加、移除或者修改处理者。

  4. 避免请求发送者和接收者之间的耦合: 当发送者和接收者之间需要解耦时,可以使用责任链模式。责任链模式将请求发送者和接收者解耦,使得系统更加灵活和可维护。

  5. 需要分派请求给一个或多个对象: 当一个请求可能需要被分派给一个或多个对象处理时,可以使用责任链模式。责任链模式可以将请求分派给多个对象,并且可以动态地确定分派策略。

总的来说,责任链模式适用于处理对象的数量和类型可能变化,或者需要动态决定处理流程的情况下。它可以帮助解耦系统的各个部分,并且使得系统更加灵活和可扩展。

标签:责任,职责,处理,模式,发送者,退款,请求
From: https://www.cnblogs.com/mchao/p/18042668

相关文章

  • 观察者模式
    importtimeclassObserver:def__init__(self,name)->None:self.name=namedefupdate(self,message):print("name%sreceivedmessage:%s"%(self.name,message))classSubject:def__init__(self)->No......
  • 策略模式
    importtimeclassLocalStrategy:defexecute(self):print("thisisalocal104execute")classSaasStrategy:defexecute(self):print("thisisasaasexecute")classSwitch:def__init__(self,strategy......
  • 23种设计模式 - 单例模式
      饿汉式特点:线程安全,调用效率高,但是不能延时加载publicclassSingletonDemo01{privatestaticSingletonDemo1instance=newSingletonDemo1();privateSingletonDemo1(){}publicstaticSingletonDemo1getInstance(){returninstance;}......
  • DM数据库几种主备模式说明
    前言DM数据库的主备集群主要是由搭建数据守护的方式来实现。DM数据守护(DMDataWatch)的实现原理非常简单:将主库(生产库)产生的Redo日志传输到备库,备库接收并重新应用Redo日志,从而实现备库与主库的数据同步。在此基础下,DM通过一些参数和接口的控制可以实现实时主备、读写分离集群......
  • 针对业务系统如何做需求分析(设计模式)
    对于一个工程师来说,如果要追求长远的发展,你就不能一直只把自己放在执行者的角色中,不能只把一个代码的实现者。你还要有独立负责一个系统的能力,能端到端开发一个完整的系统。这其中包括:前期的需求分析,中器的代码的设计和实现。后期的系统的上线维护等。 前面我们还提到过,大部分......
  • 享元模式
    简介享元模式(FlyweightPattern)是一种结构型设计模式,旨在通过共享对象来减少内存使用和提高性能。它适用于需要大量相似对象的情况,其中对象的大部分状态都可以共享,而少部分状态需要外部化。通过共享这些相似对象,可以减少内存消耗,提高系统性能。结构享元工厂(FlyweightFactory......
  • 装饰器模式
    简介装饰器模式(DecoratorPattern)是一种结构型设计模式,它允许向现有对象动态地添加新功能,同时又不改变其结构。该模式通过创建一个包装对象,也就是装饰器,来包裹原始对象,并在包裹的过程中添加新的行为或责任。结构Component(组件):定义了一个对象接口,可以给这些对象动态地添加职责......
  • 组合模式
    简介组合模式是一种结构型设计模式,它允许你将对象组合成树形结构以表现"部分-整体"的层次结构。这种模式使得用户对单个对象和组合对象的使用具有一致性。在组合模式中,有两种主要类型的对象:叶节点和组合节点。叶节点代表了树结构中的最终对象,而组合节点则表示了可以包含其他组合......
  • 桥接模式
    简介桥接模式(BridgePattern)是一种结构型设计模式,它主要用于将抽象部分与实现部分分离,从而使它们可以独立变化。桥接模式通过将继承关系转化为组合关系,使得抽象部分和实现部分可以独立地变化,不会相互影响。在桥接模式中,抽象部分通常指的是一个抽象类或接口,它定义了对外的接口或......
  • KISS 原则 (设计模式)
    KISS定义kiss原则的英文描述又几个版本,计较下边的这几个keepitsimpleandstupid.keepitshortandsimplekeepitsimpleandstraightforward不过仔细看你会发现,他们表达的意思其实差不多,尽量保持简单。它是一个万金油的设计原则,可以在很多场景中,它不仅仅经常用来指......