责任链模式介绍及演示

news/2024/5/19 13:45:03 标签: 设计模式, 责任链模式

责任链模介绍

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,其主要目的是将请求的发送者和接收者解耦。在这个模式中,多个对象有机会处理一个请求,形成一条“责任链”。每个对象在链中检查该请求并决定是否处理它或将其传递给链上的下一个对象。

关键特点

  1. 处理对象链:责任链由多个处理对象组成,每个对象有机会处理请求。
  2. 请求传递:如果一个对象不能处理请求,它会把请求传递给链中的下一个对象。
  3. 解耦发送者和接收者:请求的发送者无需知道哪个对象最终处理了该请求,从而实现了发送者和接收者之间的解耦。
  4. 动态调整:可以在运行时动态地改变链中的处理对象或者调整它们的顺序。

使用场景

责任链模式适用于以下情形:

  1. 多个对象可以处理同一个请求,但具体的处理对象在运行时才确定。
  2. 想在不明确指定接收者的情况下,向多个对象中的一个提交请求。
  3. 需要动态地组合或调整处理对象。

下面通过代码演示一下责任链模式的设计:

目标:实现一个融合定位引擎,能够根据不同的融合策略,使用多种定位技术(如蓝牙、WiFi、AOA、UWB)的组合来处理定位请求。

核心需求

  1. 融合策略灵活性:根据用户选择的融合策略,确定使用哪些定位技术。例如,用户可能选择“UWB + WiFi”或其他技术组合。
  2. 责任链模式应用:定位请求先通过一个责任链,其中每个链节点是一个定位子引擎,如UWB子引擎或WiFi子引擎。
  3. 处理逻辑
    • 每个子引擎尝试定位。
    • 如果子引擎定位成功并且达到预设的置信度,立即返回结果,不再继续后续的定位过程。
    • 如果子引擎不能满足置信度要求,将请求传递给责任链中的下一个子引擎。

结果封装:不同定位方式的结果都被封装到统一的Java Bean中。

实现:

为了实现这个融合定位引擎,我们可以设计一个责任链,其中每个节点(或“子引擎”)是一种定位技术,如蓝牙、WiFi、AOA(Angle of Arrival)、UWB(Ultra-Wideband)等。定位请求将沿着责任链传递,直到一个子引擎成功定位或链条结束。我们将使用Java来实现这个设计。

步骤 1:定义处理器接口

首先,定义一个处理器接口,它将声明用于处理定位请求的方法,并能设置下一个处理器。

public interface LocationHandler {
    void setNextHandler(LocationHandler nextHandler);
    LocationResult handleRequest(LocationRequest request);
}

步骤 2:创建具体处理器

为每种定位技术创建一个具体的处理器。每个处理器都尝试定位,如果成功且置信度足够,则返回结果;否则,将请求传递给链中的下一个处理器。

public class UWBHandler implements LocationHandler {
    private LocationHandler nextHandler;

    @Override
    public void setNextHandler(LocationHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public LocationResult handleRequest(LocationRequest request) {
        // UWB定位逻辑
        boolean isLocated = ...; // 定位是否成功
        double confidence = ...; // 置信度

        if (isLocated && confidence >= request.getRequiredConfidence()) {
            return new LocationResult(...); // 返回定位结果
        } else if (nextHandler != null) {
            return nextHandler.handleRequest(request);
        }

        return null; // 如果无法定位,返回null
    }
}

// 为WiFi, AOA, 蓝牙等实现相似的类

步骤 3:创建请求和结果类

定义定位请求和结果的类。

public class LocationRequest {
    private double requiredConfidence; // 需要的置信度

    public LocationRequest(double requiredConfidence) {
        this.requiredConfidence = requiredConfidence;
    }

    public double getRequiredConfidence() {
        return requiredConfidence;
    }
}

public class LocationResult {
    // 定位结果的数据
    // ...
}

步骤 4:构建责任链并处理请求

在客户端代码中,根据用户的融合策略构建责任链,并处理定位请求。

public class FusionLocationEngine {
    private LocationHandler chain;

    public FusionLocationEngine() {
        // 根据策略构建责任链
        LocationHandler uwb = new UWBHandler();
        LocationHandler wifi = new WiFiHandler();
        // ...

        uwb.setNextHandler(wifi);
        // ...

        this.chain = uwb; // 链的起点
    }

    public LocationResult locate(LocationRequest request) {
        return chain.handleRequest(request);
    }
}

public class Client {
    public static void main(String[] args) {
        FusionLocationEngine engine = new FusionLocationEngine();
        LocationRequest request = new LocationRequest(0.9); // 置信度要求
        LocationResult result = engine.locate(request);

        if (result != null) {
            // 处理定位结果
        } else {
            // 定位失败的逻辑
        }
    }
}

设计模式的好处

在这个设计中,责任链模式的好处非常明显:

  1. 模块化:每种定位技术都被封装在自己的处理器中,易于管理和维护。
  2. 灵活性:可以轻松添加或移除定位技术,或改变它们在责任链中的顺序。
  3. 清晰的逻辑:责任链的结构使得定位过程的流程变得清晰,易于理解。

这种设计使得融合定位引擎具有高度的灵活性和可扩展性,能够适应不同的定位需求和策略。


http://www.niftyadmin.cn/n/5333448.html

相关文章

如何在Linux运行RStudio Server并实现Web浏览器远程访问

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” 文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. …

FreeRTOS学习第7篇--周期性延迟和相对性延迟函数

目录 FreeRTOS学习第7篇--周期性延迟和相对性延迟函数时间延迟vTaskDelay函数原型vTaskDelayUntil函数原型PrintTask_Task任务相关代码片段实验现象本文中使用的测试工程 FreeRTOS学习第7篇–周期性延迟和相对性延迟函数 本文目标:学习与使用FreeRTOS中的延迟函数&…

光伏销售业务好做吗?这篇文章告诉你

随着人们对环保和清洁能源的需求不断增加,光伏行业也在迅速发展。光伏产品的销售前景非常好,但想要做光伏销售业务必须要具备一定的技术和服务能力。 一、了解市场,掌握趋势 光伏业务的市场状况和发展趋势是每个业务员必须了解的内容。通过…

Ivanti Connect Secure 曝两大零日漏洞,已被大规模利用

威胁情报公司Volexity发现,影响 Ivanti 的 Connect Secure VPN 和 Policy Secure 网络访问控制 (NAC) 设备的两个零日漏洞正在被大规模利用。自1月11日开始,多个威胁组织在大范围攻击中利用CVE-2023-46805身份验证绕过和CVE-2024-21887命令注入漏洞。 V…

【Android】ObjectBox Duplicate Class 错误分析

原因 根本原因是gradle插件不完善造成的 debugImplementation releaseImplementation plugin 多模块 以上这几种特性共同使用时,可能会造成debug实现和release实现同时被打包进apk 解决方法 严格按照以下各种来写脚本 dependencies {debugImplementation(&quo…

c++结构体和文件

当涉及到 C 中的结构体和文件操作时,我们需要了解如何定义和使用结构体,以及如何进行文件的读取和写入。下面是一篇关于 C 结构体和文件操作的文章: C 中的结构体和文件操作 C 是一种强大的编程语言,它提供了丰富的特性和功能&am…

logback日志记录器

logback介绍 logback是log4j团队创建的开源日志组件,与log4j类似但是比log4j更强大,是log4j的改良版本。主要优势在于: a) 更快的实现,logback内核重写过,是的性能有了很大的提升,内存占用也更小。 b) l…

5408. 保险箱

5408. 保险箱 - AcWing题库 #include <iostream> #include <string> #include <algorithm> #include <cstring> using namespace std;const int N 1e5 10; string x, y; int f[N][3], n; int main() {cin >> n >> x >> y;memset(…