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

责任链模式

时间:2024-09-09 15:03:16浏览次数:10  
标签:请求 处理 request 模式 责任 Handler HandleRequest successor

责任链模式是一种行为设计模式,它允许多个对象处理请求,而无需指定处理请求的具体处理者。请求沿着链传递,直到有一个对象处理它为止。这种模式允许将请求的发送者和接收者解耦,并使多个对象都有机会处理请求。

以下是一个简单的责任链模式的示例代码:

using System;

// 抽象处理者
abstract class Handler
{
    protected Handler successor;

    public void SetSuccessor(Handler successor)
    {
        this.successor = successor;
    }

    public abstract void HandleRequest(int request);
}

// 具体处理者A
class ConcreteHandlerA : Handler
{
    public override void HandleRequest(int request)
    {
        if (request < 10)
        {
            Console.WriteLine("Request " + request + " handled by ConcreteHandlerA");
        }
        else if (successor != null)
        {
            successor.HandleRequest(request);
        }
    }
}

// 具体处理者B
class ConcreteHandlerB : Handler
{
    public override void HandleRequest(int request)
    {
        if (request >= 10 && request < 20)
        {
            Console.WriteLine("Request " + request + " handled by ConcreteHandlerB");
        }
        else if (successor != null)
        {
            successor.HandleRequest(request);
        }
    }
}

class Program
{
    static void Main()
    {
        // 创建具体处理者A和B
        Handler handlerA = new ConcreteHandlerA();
        Handler handlerB = new ConcreteHandlerB();

        // 建立处理者链
        handlerA.SetSuccessor(handlerB);

        // 发送请求并在链上处理
        handlerA.HandleRequest(5);
        handlerA.HandleRequest(12);
        handlerA.HandleRequest(25);
    }
}

在上面的代码中,我们定义了一个抽象处理者 Handler 类,其中包含一个指向下一个处理者的引用 successor,并且有一个抽象方法 HandleRequest 用于处理请求。然后我们创建了两个具体处理者类 ConcreteHandlerA 和 ConcreteHandlerB,它们分别实现了处理请求的具体逻辑。

在 Main() 方法中,我们首先创建了具体处理者A和B,并将它们建立成了处理者链,即 A 处理不了的请求会传递给 B 处理。然后我们发送了几个请求,并通过责任链模式来处理这些请求。

责任链模式可以根据具体场景动态地组织处理者之间的关系,在系统中灵活地处理请求,且降低了发送者和接收者之间的耦合度。

扩展:避免死循环问题需要在末端加上终止条件

// 具体处理者C
class ConcreteHandlerC : Handler
{
    public override void HandleRequest(int request)
    {
        if (successor != null)
        {
            successor.HandleRequest(request);
        }
        else
        {
            Console.WriteLine("End of the chain - Request " + request + " cannot be handled");
        }
    }
}

class Program
{
    static void Main()
    {
        // 创建具体处理者A、B和C
        Handler handlerA = new ConcreteHandlerA();
        Handler handlerB = new ConcreteHandlerB();
        Handler handlerC = new ConcreteHandlerC();

        // 建立处理者链
        handlerA.SetSuccessor(handlerB);
        handlerB.SetSuccessor(handlerC);

        // 发送请求并在链上处理
        handlerA.HandleRequest(5); // Request 5 handled by ConcreteHandlerA
        handlerA.HandleRequest(12); // Request 12 handled by ConcreteHandlerB
        handlerA.HandleRequest(25); // End of the chain - Request 25 cannot be handled
    }
}

在这个修改后的示例代码中,我们添加了一个新的具体处理者 ConcreteHandlerC,它并不实际处理请求,只是打印出一个结束消息。在处理者链的末端,我们让最后一个处理者 handlerC 不再调用后续的处理者,而是直接输出结束消息,表明请求无法被处理。当将超出所有处理者能力范围的请求发送到处理者链时,在这种情况下,处理者链能够正确地终止并指示该请求无法被处理。

通过添加适当的终止条件,我们可以有效避免责任链模式中的死循环问题,保证系统的稳定性和正确性。

标签:请求,处理,request,模式,责任,Handler,HandleRequest,successor
From: https://www.cnblogs.com/wuqihe/p/18404598

相关文章

  • 案例分析:如何用设计模式优化性能14
    设计模式就是对常用开发技巧进行的总结,它使得程序员之间交流问题,有了更专业、便捷的方式。比如,我们在《02|理论分析:性能优化有章可循,谈谈常用的切入点》中提到,I/O模块使用的是装饰器模式,你就能很容易想到I/O模块的代码组织方式。事实上,大多数设计模式并不能增加程序的性......
  • 案例分析:如何用设计模式优化性能15
    设计模式就是对常用开发技巧进行的总结,它使得程序员之间交流问题,有了更专业、便捷的方式。比如,我们在《02|理论分析:性能优化有章可循,谈谈常用的切入点》中提到,I/O模块使用的是装饰器模式,你就能很容易想到I/O模块的代码组织方式。事实上,大多数设计模式并不能增加程序的性......
  • 案例分析:如何用设计模式优化性能8
    设计模式就是对常用开发技巧进行的总结,它使得程序员之间交流问题,有了更专业、便捷的方式。比如,我们在《02|理论分析:性能优化有章可循,谈谈常用的切入点》中提到,I/O模块使用的是装饰器模式,你就能很容易想到I/O模块的代码组织方式。事实上,大多数设计模式并不能增加程序的性......
  • 案例分析:如何用设计模式优化性能10
    设计模式就是对常用开发技巧进行的总结,它使得程序员之间交流问题,有了更专业、便捷的方式。比如,我们在《02|理论分析:性能优化有章可循,谈谈常用的切入点》中提到,I/O模块使用的是装饰器模式,你就能很容易想到I/O模块的代码组织方式。事实上,大多数设计模式并不能增加程序的性......
  • Prometheus的拉取模式与zabbix推送模式有何区别?各有什么优缺点?
    Prometheus的拉取模式与Zabbix的推送模式在监控数据收集和处理方式上存在显著区别。以下是它们的主要区别及各自的优缺点:1.数据收集模式Prometheus拉取模式:Prometheus定期从被监控的目标(如Exporter、应用程序等)主动拉取数据。每个目标都需要暴露一个HTTP接口,Prome......
  • Java--设计模式
    目录23种设计模式创建型模式结构型模式行为型模式设计模式的本质单例模式工厂模式定义解耦(对象使用过程+对象创建过程)分类简单工厂模式代理模式适配器模式外观模式策略模式23种设计模式创建型模式工厂模式(FactoryPattern)抽象工厂模式(AbstractFactoryPattern)单例模式(S......
  • selenium自动化检测方法总结 携带用户数据 绕过检测 无头模式 句柄切换
    1.selenium携带用户数据fromseleniumimportwebdriverfromselenium.webdriver.chrome.serviceimportServiceservice=Service(executable_path='chromedriver.exe')option=webdriver.ChromeOptions()user_data_dir=r'C:\Users\12501\AppData\Local......
  • Java设计模式—策略模式(Strategy)
    模式动机完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可以使用一种设计模式来使得系统可以灵活地选择解决途径,也能够方便地增加......
  • 设计模式 20 状态模式
    设计模式20创建型模式(5):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式结构型模式(7):适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式行为型模式(11):责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者......
  • 设计模式 21 策略模式
    设计模式21创建型模式(5):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式结构型模式(7):适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式行为型模式(11):责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者......