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

责任链模式

时间:2024-07-04 22:42:34浏览次数:16  
标签:请求 处理 request 模式 责任 handleRequest SupportHandler public

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将请求沿着一条包含多个处理器的链进行传递。每个处理器都可以选择处理请求或将其传递给下一个处理器。这种模式使得多个对象都有机会处理请求,而无需显式地指定处理请求的对象,从而实现了请求发送者和接收者之间的解耦。

关键点

  • 请求的传递:请求从链中的一个处理器传递到下一个处理器,直到被处理或到达链的末端。
  • 处理者的抽象:处理者通常是一个抽象类或接口,每个具体的处理者实现这个抽象类或接口并定义如何处理请求。
  • 灵活的链条:处理者可以动态地添加到链条中,链条的顺序可以在运行时调整。

适用场景

  • 请求的处理者不明确:在设计初期无法预料请求会被哪个处理器处理。
  • 动态指定处理者:处理者可以在运行时动态添加或修改。
  • 减少耦合:请求的发送者和接收者解耦,以避免硬编码的处理逻辑。

代码示例

假设我们有一个客户支持系统,用户的请求可以是简单的询问、中等复杂度的问题或复杂的问题。我们将这些请求交给不同的处理者。

处理者接口

abstract class SupportHandler {
    protected SupportHandler nextHandler;

    public void setNextHandler(SupportHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    public void handleRequest(String request) {
        if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

具体处理者

class BasicSupportHandler extends SupportHandler {
    @Override
    public void handleRequest(String request) {
        if (request.equals("basic")) {
            System.out.println("BasicSupportHandler handling request: " + request);
        } else {
            super.handleRequest(request);
        }
    }
}

class IntermediateSupportHandler extends SupportHandler {
    @Override
    public void handleRequest(String request) {
        if (request.equals("intermediate")) {
            System.out.println("IntermediateSupportHandler handling request: " + request);
        } else {
            super.handleRequest(request);
        }
    }
}

class AdvancedSupportHandler extends SupportHandler {
    @Override
    public void handleRequest(String request) {
        if (request.equals("advanced")) {
            System.out.println("AdvancedSupportHandler handling request: " + request);
        } else {
            super.handleRequest(request);
        }
    }
}

使用责任链

public class Main {
    public static void main(String[] args) {
        // 创建具体处理者
        SupportHandler basicHandler = new BasicSupportHandler();
        SupportHandler intermediateHandler = new IntermediateSupportHandler();
        SupportHandler advancedHandler = new AdvancedSupportHandler();

        // 设置责任链
        basicHandler.setNextHandler(intermediateHandler);
        intermediateHandler.setNextHandler(advancedHandler);

        // 处理请求
        basicHandler.handleRequest("basic");        // 输出: BasicSupportHandler handling request: basic
        basicHandler.handleRequest("intermediate"); // 输出: IntermediateSupportHandler handling request: intermediate
        basicHandler.handleRequest("advanced");     // 输出: AdvancedSupportHandler handling request: advanced
        basicHandler.handleRequest("unknown");      // 无输出, 请求到达链的末端, 未被处理
    }
}

优点

  1. 降低耦合度:请求发送者和处理者之间的耦合度降低。
  2. 灵活性高:可以灵活地添加或修改处理者,改变处理顺序。
  3. 责任分担:多个处理者共同分担处理请求的责任。

缺点

  1. 调试困难:由于请求的传递是动态的,调试时可能较为复杂。
  2. 可能没有处理者:如果没有处理者能处理请求,可能会造成请求未被处理的情况。

总结

责任链模式通过创建一系列处理者对象,使得多个处理者有机会处理请求,从而实现了请求发送者和接收者的解耦。它特别适用于处理链条中处理者不明确或需要动态指定的场景,但需要注意链条的调试和维护问题。

标签:请求,处理,request,模式,责任,handleRequest,SupportHandler,public
From: https://www.cnblogs.com/gongchengship/p/18284831

相关文章

  • 状态模式的好处是什么
    状态模式(StatePattern)是一种行为设计模式,它允许对象在其内部状态发生改变时改变其行为,使得对象看起来好像修改了其类。状态模式的核心思想是将与某个状态相关的行为封装到一个独立的状态类中,以便在对象状态发生变化时,可以轻松切换状态对象,从而改变对象的行为。状态模式的好处......
  • vue项目中使用AES实现密码加密解密ECB和CBC模式)
    ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或或操作后再加密,这样做的目的是增强破解难度。(不容易主动攻击,安全性好于ECB,是SSL、IPSec的标准) 1.先安装crypto-......
  • 【ESP32】打造全网最强esp-idf基础教程——15.WiFi连接STA模式
    WiFi连接STA模式一、ESP32的WiFi功能介绍    前面章节内容,基本上都是描述了ESP32强大的MCU能力,这些MCU能力使得ESP32可以替换许多类型的单片机工作,而自己承担这部分功能;当然ESP32的IOT能力才是它的主业,从硬件配置来看,ESP32支持2.4GHz频段WiFi+BT(LE)4.2,而esp-idf对WiFi......
  • 以银行卡取钱的流程为例的状态模式的 java 的 demo
    好的,下面我们将用状态模式来实现一个模拟从银行卡取钱的流程。假设我们有以下几个状态:输入卡输入密码选择操作取款取卡我们通过状态模式来实现这些状态之间的切换。状态接口首先,我们定义一个状态接口ATMState://ATMState.javapublicinterfaceATMState{void......
  • JavaScript中的异步模式
    JavaScript中的异步模式JavaScript语言的执行环境是“单线程(singlethread)”,就是指一次只能完成一个任务。如果有多个任务,就必须排队,等前面一个任务完成,再执行后面一个任务,以此类推。这种模式的好处是实现起来比较简单,执行环境相对单纯,坏处是只要有一个任务耗时很长,后面的任务......
  • 状态模式的精髓是什么
    状态模式(StatePattern)的精髓在于将对象的行为包装在状态对象中,并通过状态对象改变对象的行为。它允许对象在内部状态改变时改变其行为,使得对象看起来好像修改了其类。核心思想状态封装:将不同状态下的行为封装到不同的状态类中,避免了大量的条件语句(如if或switch)。状......
  • 如何启动一个 server 模式的 h2 数据库
    要启动一个server模式的H2数据库,可以按照以下步骤操作:准备工作下载H2数据库:首先,您需要从H2数据库的官方网站下载H2数据库的JAR文件。访问H2DatabaseEngine并下载最新版本的h2-x.x.x.jar文件。Java环境:确保您的计算机上安装了Java环境(JRE或JDK),并配......
  • 设计模式-设计原则与设计模式总结
    设计原则,是设计模式的基础。在实际开发中,并不是一定要求所有代码都遵循设计原则,我们需要综合考虑人力、时间、成本、质量,不是可以追求完美,要在设当的场景遵循合适的设计原则,体现的是一种平衡取舍,帮助我们设计出更加优雅的代码结构。设计模式(DesignPattern)是前辈们经过相当长的......
  • 设计模式-访问者模式
    访问者模式访问者模式(VisitorPattern)是一种将数据结构与数据操作分离的设计模式,是指封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作,属于行为型模式。访问者模式被称为最复杂的设计模式,但是使用率不高。不过,一旦你需要......
  • 【设计模式(三)】创建型模式--单例模式
    创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。饿汉式类加载就会导致该单实例对象被创建/***饿汉式*静态变量创建类的对象*/publicclassSingleton{//......