当前位置: 首页 > news >正文

责任链模式介绍及演示

责任链模介绍

责任链模式(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;@Overridepublic void setNextHandler(LocationHandler nextHandler) {this.nextHandler = nextHandler;}@Overridepublic 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. 清晰的逻辑:责任链的结构使得定位过程的流程变得清晰,易于理解。

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

相关文章:

责任链模式介绍及演示

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

智能小程序小部件(Widget)表单组件属性说明+代码明细

在 Tuya MiniApp Tools 中,新建项目并选择小部件(Widget)对应模板即可自动创建小部件(Widget)项目。 button 按钮,用于强调操作并引导用户去点击。 属性说明 属性名类型默认值必填说明sizestringdefault否按钮的大小typestringdefault否按钮的样式类…...

自学Python笔记总结(更新中……)

自学Python笔记总结 网址数据类型类型查看类型,使用type内置类标识符 输出输入语句format函数的语法及用法数据类型的转换运算符算数运算符赋值运算符的特殊场景拆包 比较运算符逻辑运算符 与 短路位运算符运算符优先级 程序流程控制分支语句pass 占位 循环语句 whi…...

十四.变量、异常处理

变量、异常处理 1.变量1.1系统变量1.1.1系统变量分类1.1.2查看系统变量 1.2用户变量1.2.1用户变量分类1.2.2会话用户变量1.2.3局部变量1.2.4对比会话用户变量与局部变量 补充:MySQL 8.0的新特性—全局变量的持久化 2.定义条件与处理程序2.1案例分析2.2定义条件2.3定义处理程序2…...

import { ArrowRight } from “@element-plus/icons-vue“;

今天下午快被这个问题折磨疯了 虽然知道这个问题怎么产生的 但项目里那个碍眼的红线就是去不掉 后来才发现 这是插件的锅 我的心情 你知道我想要说什么的 想必能看到这篇文章的 也知道这个问题是怎么产生的 vue3ts使用的时候 默认是需要带上文件名的 但是引入el组件时 …...

Kubernetes 面试宝典

创建 Pod的主要流程? 客户端提交 Pod 的配置信息(可以是 yaml 文件定义的信息)到 kube-apiserver. Apiserver 收到指令后,通知 controllr-manager 创建一个资源对象 controller-manager 通过 apiserver 将 pod 的配置信息存储到 ETCD 数据中薪心中 kube-scheduler 检查到 p…...

c语言二维数组

系列文章目录 c语言二维数组 c语言二维数组 系列文章目录一、二维数组的定义一、二维数组的内存模型 一、二维数组的定义 int main() {//二维数组的定义int arr[3][4];arr[0][0]; arr[0][1]; arr[0][2]; arr[0][3]; arr[0][4];arr[1][0]; arr[1][1]; arr[1][2]; arr[1][3]; ar…...

ArcGIS Pro 拓扑编辑和常见一些拓扑错误处理

7.4 拓扑编辑 拓扑编辑也叫共享编辑,多个数据修改时,一块修改,如使用数据:chp7\拓扑检查.gdb,数据集DS下JZX、JZD和DK,加载地图框中,在“地图”选项卡下选择“地图拓扑”或“ds_Topology(地理数据库)”&…...

前端踩坑之——antDesignVue的upload组件

本地启动时控制台会报404,放到服务器上控制台会报405(多发一个请求) 原因:upLoad有默认的上传事件 解决:阻止默认事件即可 beforeUpload Hook function which will be executed before uploading. Uploading will be stopped with false or …...

设计模式——策略模式

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法独立于使用它的客户端代码,使得算法的变化不会影响到使用该算法的客户端…...

Ubuntu12.0安装g++过程及其报错

Ubuntu12.0安装g过程及其报错 https://blog.csdn.net/weixin_51286763/article/details/120703953 https://blog.csdn.net/dingd1234/article/details/124029945 2.报错二: [41/80] Building CXX object absl/synchronization/CMakeFiles/graphcycles_internal.di…...

rime中州韵小狼毫 汉语拼音输入方案

教程目录:rime中州韵小狼毫须鼠管安装配置教程 保姆级教程 100增强功能配置教程 在word中,我们可以轻易的给汉字加上拼音,如下👇: 但是,如何单独的输入拼音呢?例如输入 pīn yīn, 再如 zhōn…...

网页设计(八)HTML5基础与CSS3应用

一、当当网企业用户注册页面设计 当当网企业用户注册页面 改版后当当网企业用户注册页面 <!-- prj_8_1.html --> <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>当当网企业用户注册页面设计</title><s…...

模拟瑞幸小程序购物车

是根据渡一袁老师的大师课写的&#xff0c;如有什么地方存在问题&#xff0c;还请大家指出来哟ど⁰̷̴͈꒨⁰̷̴͈う♡&#xff5e; index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-e…...

react js自定义实现状态管理

redux基础实现 myRedux export const createStore (reduce) > {if (typeof reduce ! function) throw new Error(Expected the reducer to be a function.)let state,listeners []state reduce()const getState () > stateconst dispatch (action) > {if(typeo…...

行为型设计模式——中介者模式

中介者模式 中介者模式主要是将关联关系由一个中介者类统一管理维护&#xff0c;一般来说&#xff0c;同事类之间的关系是比较复杂的&#xff0c;多个同事类之间互相关联时&#xff0c;他们之间的关系会呈现为复杂的网状结构&#xff0c;这是一种过度耦合的架构&#xff0c;即…...

通信行业无线基本概念

fast roaming&#xff08;快速漫游&#xff09;&#xff1a;使用户在不同的基站&#xff08;access point&#xff09;间可以平滑的切换&#xff0c;在802.11r协议标准中定义。band steering&#xff08;波段转向&#xff09;&#xff1a;在双频段&#xff08;2.4G和5G&#xf…...

grep 在运维中的常用可选项

一、对比两个文件 vim -d <filename1> <filename2> 演示&#xff1a; 需求&#xff1a;&#xff5e;目录下有两个文件一个test.txt 以及 text2.txt,需求对比两个文件的内容。 执行后会显示如图&#xff0c;不同会高亮。 二、两次过滤 场景&#xff1a;当需要多…...

python读取Dicom文件

文章目录 1. pydicom Library2. SimpleITK Library3. ITK Library (Insight Toolkit)4. GDCM Library (Grassroots DICOM) 下面提供几种用python方法读取Dicom文件 1. pydicom Library import pydicom # Read DICOM file dataset pydicom.dcmread("path_to_dicom_file.d…...

UL2034详细介绍UL 安全单站和多站一氧化碳报警器标准

在介绍相关标准之前先介绍一下UL认证和UL测试报告的区别&#xff0c;检测认证行业6年老司机 UL认证是自愿性的认证&#xff0c;需要检测产品和审核工厂&#xff0c;每个季度审核一次&#xff0c;费用高、时间久&#xff0c;而且审厂非常的严格。 UL测试报告是根据产品选用相应…...

无人机视角热成像行人车辆检测数据集VOC+YOLO格式2755张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数)&#xff1a;2755标注数量(xml文件个数)&#xff1a;2755标注数量(txt文件个数)&#xff1a;2755标注类别…...

告别样本不平衡噩梦:Focal Loss 让你的模型学会“划重点”

我说的不是 Python 那个 HTTPX 客户端&#xff0c;而是 ProjectDiscovery 出的 httpx。官方对它的定义很直接&#xff1a; 一个高性能、面向多探针的 HTTP 工具包支持高并发下对 URL、主机、CIDR 等 目标做 HTTP 层探测&#xff0c;并尽量保证结果稳定性。 它本质上不是漏洞扫描…...

AI超分辨率技术突破:OptiScaler实现跨显卡自由体验

AI超分辨率技术突破&#xff1a;OptiScaler实现跨显卡自由体验 【免费下载链接】OptiScaler DLSS replacement for AMD/Intel/Nvidia cards with multiple upscalers (XeSS/FSR2/DLSS) 项目地址: https://gitcode.com/GitHub_Trending/op/OptiScaler 你的显卡是否因厂商…...

三相LCL型并网逆变器:电容电流反馈与全前馈电网电压控制策略研究,谐波THD优化至5%以下的相...

三相lcl型并网逆变器控制策略 电容电流反馈和电网电压全前馈&#xff0c;加入5.7.11.13次谐波thd&#xff1c;5。 相关方面电力电气工程&#xff0c;电子信息工程等等都可以。最近在调试三相LCL并网逆变器时发现个有意思的现象&#xff1a;当电网背景谐波严重时&#xff0c;常规…...

各工厂产能负荷不透明?SAP 集团生产模块实现服装多工厂协同生产

在服装企业规模化扩张过程中&#xff0c;多工厂布局成为提升产能、覆盖市场的重要选择&#xff0c;但 “各工厂产能负荷不透明” 却成为制约协同效率的关键瓶颈。很多服装集团面临这样的困境&#xff1a;总部不清楚 A 工厂的高端定制生产线是否饱和&#xff0c;B 工厂的批量生产…...

BilibiliDown终极指南:简单快速下载B站视频的完整教程

BilibiliDown终极指南&#xff1a;简单快速下载B站视频的完整教程 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/b…...

避坑指南:金融风控建模中最容易被忽略的5个数据陷阱(以贷款违约预测为例)

金融风控建模实战&#xff1a;避开数据处理的五大隐形陷阱 在金融风控领域&#xff0c;数据科学家们常常陷入一个怪圈&#xff1a;模型越调越复杂&#xff0c;但预测效果却停滞不前。我曾见证过一个团队花费三个月优化算法&#xff0c;最终发现问题的根源竟是数据预处理阶段的…...

Jupyter Notebook内核崩溃?别急着重装!试试这个Anaconda环境修复方案

Jupyter Notebook内核崩溃&#xff1f;别急着重装&#xff01;Anaconda环境修复全指南 当你正专注地编写代码&#xff0c;突然看到"内核似乎挂掉了&#xff0c;它很快将自动重启"的提示&#xff0c;那种挫败感我深有体会。作为数据科学工作者&#xff0c;Jupyter Not…...

open_clip技术解构:从核心原理到产业级应用

open_clip技术解构&#xff1a;从核心原理到产业级应用 【免费下载链接】open_clip An open source implementation of CLIP. 项目地址: https://gitcode.com/GitHub_Trending/op/open_clip 一、价值定位&#xff1a;重新定义多模态AI开发范式 核心问题&#xff1a;为什…...

DanKoe 视频笔记:赚钱是精神性的:破除“高尚的失败者”的迷思 [特殊字符]

在本节课中&#xff0c;我们将要学习一种关于金钱、商业和道德的全新视角。我们将探讨为何将赚钱视为不道德是一种幻觉&#xff0c;以及这种观念如何阻碍你为世界创造真正的价值。 在当今世界&#xff0c;最糟糕的事情之一就是陷入“高尚的失败者”的思维模式。许多聪明人讨厌…...