Java设计模式——职责链模式:解锁高效灵活的请求处理之道
嘿,各位 Java 编程大神和爱好者们!今天咱们要一同深入探索一种超厉害的设计模式——职责链模式。它就像一条神奇的“处理链”,能让请求在多个对象之间有条不紊地传递,直到找到最合适的“处理者”。准备好跟我一起揭开它神秘的面纱,看看如何用代码实现这种强大的模式,让我们的程序变得更加智能和灵活吧!💥
一、职责链模式:请求处理的“智能传送带”🎯
(一)模式定义与神奇特点
职责链模式可是对象行为模式家族里的“明星成员”哦!想象一下,有一群对象像链条上的环一样紧密相连,每个对象都知道下一个对象是谁(持有下家的引用)。当一个请求像小包裹一样在这条链上传递时,它会逐个经过这些对象。而发出请求的客户端呢,就像把包裹送到快递公司后就安心等待结果一样,完全不用操心到底是哪个对象最终会处理这个请求。这种模式最大的魅力在于它赋予了系统超级强大的灵活性。比如说,我们可以随时调整这条链的结构,添加、删除或者重新排列处理者,而客户端那边却感觉不到任何变化,就像魔法一样!🧙♂️
用一个超形象的比喻来理解,职责链模式就像是一场接力赛跑,每个选手(处理者)都有自己的能力范围(处理条件)。当接力棒(请求)传来时,如果这个选手有能力完成接下来的路程(处理请求),那就全力冲刺;如果觉得自己力不从心,就迅速把接力棒交给下一个选手,直到找到那个能冲过终点线(处理请求)的“大神”选手。
再举个生活中的例子,就拿击鼓传花来说吧。一群小伙伴围成一个圈(形成责任链),鼓声响起时开始传花(请求传递)。每个小伙伴就像是链上的一个处理者,当花传到自己手上时,如果鼓声停止(满足某种条件),那这个小伙伴就要表演节目(处理请求);如果鼓声还在响,就赶紧把花传给下一个小伙伴。这里的小伙伴们可以站成直线、围成环形或者组成树状结构的一部分,具体怎么站完全取决于大家想怎么玩这个游戏(业务逻辑和需求)。🎊
(二)模式结构大揭秘
- 抽象处理者(Handler):链的“基石”与“规则制定者”
- 抽象处理者就像是整个职责链的“总设计师”,它定义了处理请求的统一接口,就像给所有处理者制定了一套必须遵守的“游戏规则”。在某些情况下,它还会规定怎么设置和获取下一个处理者(下家)的方法。一般来说,它会以抽象类或者接口的形式存在,为具体的处理者提供了一个清晰的行为框架和接口规范,确保所有处理者都能“按章办事”。就好比建筑蓝图,规定了房子该怎么盖,每个房间的布局和功能一样。🏠
- 具体处理者(ConcreteHandler):请求的“接收者”与“传递者”
- 具体处理者可是链上的“实干家”,当请求送到它面前时,它有两种选择。一种是根据自己的能力和判断,决定是否亲自处理这个请求。如果它觉得自己能行,就会按照自己的方式处理请求,就像厨师根据订单(请求)烹饪美食(处理逻辑);另一种情况是,如果它觉得自己搞不定,或者根据业务规则应该让更厉害的人来处理,它就会毫不犹豫地把请求转交给下家。因为它知道下家是谁(持有下家引用),所以能轻松地把请求传递下去,让请求继续在链上“旅行”。就像快递员,如果发现包裹的目的地不在自己的配送范围内,就会转交给下一个区域的快递员。🚚
(三)代码实现:构建职责链
下面是一个用 Java 实现的职责链模式的简单示例代码,让我们一起来看看它是如何工作的。
// 抽象处理者(Handler)
abstract class Handler {// 持有下一个处理者的引用protected Handler successor;// 设置下一个处理者的方法public void setSuccessor(Handler successor) {this.successor = successor;}// 抽象的处理请求方法,具体处理逻辑由子类实现abstract public void handleRequest(int request);
}// 具体处理者 1(ConcreteHandler1)
class ConcreteHandler1 extends Handler {@Overridepublic void handleRequest(int request) {// 如果请求在 0 到 10 之间(这里只是一个简单的示例条件),则由当前处理者处理if (request >= 0 && request < 10) {System.out.println(this + " handled request " + request);} else if (successor!= null) {// 否则,将请求传递给下一个处理者(如果有下家的话)successor.handleRequest(request);}}
}// 具体处理者 2(ConcreteHandler2)
class ConcreteHandler2 extends Handler {@Overridepublic void handleRequest(int request) {if (request >= 10 && request < 20) {System.out.println(this + " handled request " + request);} else if (successor!= null) {successor.handleRequest(request);}}
}// 具体处理者 3(ConcreteHandler3)
class ConcreteHandler3 extends Handler {@Overridepublic void handleRequest(int request) {if (request >= 20 && request < 30) {System.out.println(this + " handled request " + request);} else if (successor!= null) {successor.handleRequest(request);}}
}// 客户端测试类
public class Client {public static void main(String[] args) {// 创建处理者对象Handler h1 = new ConcreteHandler1();Handler h2 = new ConcreteHandler2();Handler h3 = new ConcreteHandler3();// 设置处理者之间的链关系,形成 h1 -> h2 -> h3 的链h1.setSuccessor(h2);h2.setSuccessor(h3);// 生成一些请求并处理int[] requests = {2, 5, 14, 22, 18, 3, 27, 20};for (int request : requests) {h1.handleRequest(request);}}
}
(四)纯与不纯的职责链模式
- 纯职责链模式:规则严格的“处理链”
- 在纯职责链模式的世界里,规则那是相当严格的。对于每一个具体的处理者来说,当收到请求时,它只能二选一:要么勇敢地承担起处理请求的全部责任,就像独自扛起一座大山;要么毫不犹豫地把责任推给下家,绝不拖泥带水。而且,在这条链上,每个请求就像一个被精心安排的小旅客,必定会被某个处理者收留并妥善处理,绝对不会出现被忽视、流落街头的情况。不过呢,这种模式在现实生活中的例子比较少,因为它的实现和应用场景相对来说有点“挑食”,要求比较高,不够灵活。就像一个只接受特定规格零件的精密仪器,稍微有点不匹配就无法工作。🔍
- 不纯职责链模式:适应变化的“万能链”
- 不纯职责链模式就随和多了,它允许请求在传递过程中,即使经过了所有的处理者,也可能找不到一个愿意收留它的“家”。这种模式在实际开发中可是非常受欢迎的“大众明星”,因为它能更好地应对复杂多变的业务需求。比如说,在某些业务场景中,一个请求可能像一个挑剔的顾客,在经过一系列的服务者(处理者)后,还是没有找到满意的服务(没有合适的处理者)。这时候,系统可以根据预先设定的策略,比如记录下这个“挑剔顾客”的需求(记录日志),或者礼貌地告诉它“不好意思,我们无法满足您的需求”(返回错误信息)。就像一家餐厅,如果遇到顾客点了菜单上没有的菜品,服务员可以记录下来反馈给厨房(记录日志),或者向顾客解释并推荐其他菜品(返回错误信息)。🍽
(五)实际应用案例:采购审批系统中的职责链
让我们来看一个更贴近实际工作场景的例子——采购审批系统。
// 抽象审批者(Approver)
abstract class Approver {// 审批者姓名protected String name;// 持有下一个审批者的引用protected Approver successor;// 构造函数,初始化审批者姓名public Approver(String name) {this.name = name;}// 设置下一个审批者的方法public void setSuccessor(Approver successor) {this.successor = successor;}// 抽象的审批请求方法,具体审批逻辑由子类实现abstract public void processRequest(PurchaseRequest request);
}// 主管审批者(Director)
class Director extends Approver {public Director(String name) {super(name);}@Overridepublic void processRequest(PurchaseRequest request) {if (request.getAmount() < 10000.0) {System.out.println(this + " " + name + " approved request# " + request.getNumber());} else if (successor!= null) {successor.processRequest(request);}}
}// 副总裁审批者(VicePresident)
class VicePresident extends Approver {public VicePresident(String name) {super(name);}@Overridepublic void processRequest(PurchaseRequest request) {if (request.getAmount() < 25000.0) {System.out.println(this + " " + name + " approved request# " + request.getNumber());} else if (successor!= null) {successor.processRequest(request);}}
}// 总裁审批者(President)
class President extends Approver {public President(String name) {super(name);}@Overridepublic void processRequest(PurchaseRequest request) {if (request.getAmount() < 100000.0) {System.out.println(this + " " + name + " approved request# " + request.getNumber());} else {System.out.println("Request# " + request.getNumber() + " requires an executive meeting!");}}
}// 采购请求类(PurchaseRequest)
class PurchaseRequest {private double amount;private int number;public PurchaseRequest(double amount, int number) {this.amount = amount;this.number = number;}public double getAmount() {return amount;}public int getNumber() {return number;}
}
在这个采购审批系统中,我们定义了不同级别的审批者,从主管、副总裁到总裁,他们就像一条职责链上的各个环节。当一个采购请求(就像一个任务包裹)被提交后,它会从主管开始,沿着这条审批链依次传递。如果采购金额比较小,比如小于 10000 元,主管就可以直接批准(处理请求);如果金额超过了主管的审批权限,主管就会把请求交给副总裁。副总裁也会根据金额大小决定是否批准,如果金额超过了副总裁的权限,就继续传递给总裁。这样,不同金额的采购请求就能找到合适的审批者进行处理。而且,如果未来公司的审批流程发生了变化,比如增加了新的审批层级或者修改了审批金额的限制,我们只需要在相应的审批者类中进行修改,就像调整链条上的某个环节一样,不会对整个审批系统的结构造成太大的影响。这就是职责链模式在实际应用中的强大之处,它让系统变得更加灵活和易于维护。💼
二、总结与展望:职责链模式的无限潜力💡
通过对职责链模式的深入学习,我们就像获得了一把神奇的钥匙,可以打开高效灵活处理请求的大门。它不仅让我们的代码结构更加清晰,各个处理者之间的职责分明,还让系统能够轻松应对各种变化,无论是业务规则的调整还是处理流程的优化。
在未来的开发中,我们可以继续探索职责链模式的更多应用场景,比如在工作流系统、消息处理系统、异常处理机制等方面都可以发挥它的优势。同时,我们也可以结合其他设计模式,如工厂模式来创建处理者对象,或者结合装饰者模式来增强处理者的功能,让我们的程序更加健壮和强大。相信只要我们善于运用这些设计模式,就能打造出更加优秀、高效的软件系统,在编程的世界里创造更多的精彩!🚀
相关文章:
Java设计模式——职责链模式:解锁高效灵活的请求处理之道
嘿,各位 Java 编程大神和爱好者们!今天咱们要一同深入探索一种超厉害的设计模式——职责链模式。它就像一条神奇的“处理链”,能让请求在多个对象之间有条不紊地传递,直到找到最合适的“处理者”。准备好跟我一起揭开它神秘的面纱…...
ubuntu20配置mysql注意事项
目录 一、mysql安装 二、初始化配置密码 三、配置文件的位置 四、常用的mysql命令 五、踩坑以及解决方法 一、mysql安装 1.更新apt源 sudo apt update 2.安装mysql服务 sudo apt-get install mysql-server 3.初始化配置 sudo mysql_secure_installation 4.配置项 VALI…...
JDBC 设置 PostgreSQL 查询中 any(?) 的参数
这段时间都纠缠于 Java 如何操作 PostgreSQL 数据库上,千方百计的为求得更好的性能。为此我们用上了 Batch, 或用 id any(?) 这种更 PostgreSQL 化的数组参数操作。其实它还有更多数组方面的花样可以玩,毕竟 PostgreSQL 数据库有一种广纳百川的胸怀&am…...
论文笔记(五十七)Diffusion Model Predictive Control
Diffusion Model Predictive Control 文章概括摘要1. Introduction2. Related work3. 方法3.1 模型预测控制3.2. 模型学习3.3. 规划(Planning)3.4. 适应 4. 实验(Experiments)4.1. 对于固定奖励,D-MPC 可与其他离线 RL…...
【在Linux世界中追寻伟大的One Piece】多线程(三)
目录 1 -> Linux线程同步 1.1 -> 条件变量 1.2 -> 同步概念与竞态条件 1.3 -> 条件变量函数 1.4 -> 为什么pthread_cond_wait需要互斥量 1.5 -> 条件变量使用规范 2 -> 生产者消费者模型 2.1 -> 为什么要使用生产者消费者模型 2.2 -> 生产…...
eBay 基于 Celeborn RESTful API 进行自动化工具集成实践
作者:王斐,ebay Hadoop 团队软件工程师,Apache Kyuubi PMC member,Apache Celeborn Committer。 简介:Apache Celeborn 是一个统一的大数据中间服务,致力于提高不同MapReduce引擎的效率和弹性。为了Spark …...
Vue 前端 el-input 如何实现输入框内容始终添加在尾部%
要在 el-input 输入框的尾部添加 %,你可以通过两种方式来实现: 使用 suffix 插槽:这是最直接和最常用的方法。使用 append 插槽:如果你需要在输入框内或者右侧显示其他内容。 方法 1:使用 suffix 插槽 el-input 提供…...
如何通过轻易云实现泛微OA与金蝶云星空的数据无缝对接
FD003-非生产性付款申请 泛微>金蝶付款单-422 数据集成案例分享 在企业信息化系统中,数据的高效流转和准确对接是确保业务流程顺畅运行的关键。本文将重点探讨如何通过轻易云数据集成平台,实现泛微OA-Http与金蝶云星空之间的数据无缝对接,…...
【docker】docker的起源与容器的由来、docker容器的隔离机制
Docker 的起源与容器的由来 1. 虚拟机的局限:容器的需求萌芽 在 Docker 出现之前,开发和部署软件主要依赖虚拟机(VMs): 虚拟机通过模拟硬件运行操作系统,每个应用程序可以运行在自己的独立环境中。虽然虚…...
mysql 事务之LBCC与MVCC
一、事务 数据库事务(Database Transaction)是数据库管理系统(DBMS)中执行的一系列操作,这些操作被当作一个逻辑单元进行处理,以保证数据的一致性和完整性。 ACID,事务四个关键特性 1、原子性…...
记一次 .NET某hdp智能柜系统 卡死分析
一:背景 1. 讲故事 停了一个月时间没有更新博客了,主要是这段时间有些许事情导致心神不宁,我这个人也比较浮躁所以无法潜心修炼,事情如下: 被狗咬了 也不知道是不是出门没看黄历,在小区门口店里买烟&am…...
大模型专栏--Spring Ai Alibaba介绍和功能演示
Spring AI Alibaba 介绍和功能演示 背景 Spring AI Alibaba 开源项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。…...
【GPT】为什么人需要睡觉?
睡觉对人类来说是至关重要的生理和心理需求。以下是一些为什么人需要睡觉的主要原因,以及睡眠对身体和大脑的影响: 1. 恢复与修复 身体修复:在睡眠期间,身体进行细胞修复和再生。例如,生长激素在深度睡眠中分泌&#…...
【Linux】磁盘 | 文件系统 | inode
🪐🪐🪐欢迎来到程序员餐厅💫💫💫 主厨:邪王真眼 主厨的主页:Chef‘s blog 所属专栏:青果大战linux 总有光环在陨落,总有新星在闪烁 模电好难啊ÿ…...
A051-基于Spring Boot的网络海鲜市场系统的设计与实现
🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…...
谷歌浏览器Chrome打开百度很慢,其他网页正常的解决办法,试了很多,找到了适合的
最近不知怎么的,Chrome突然间打开百度很慢,甚至打不开。不光我一个人遇到这问题,我同事也遇到这个问题。开发中难免遇到问题,需要百度,现在是百度不了。 作为一名开发人员,习惯了使用Chrome进行开发&#…...
《企业级低代码开发平台技术要求》核心要点解析
一、引言 在数字化转型的浪潮中,企业级低代码开发平台成为推动企业创新与发展的关键力量。深圳市标准化协会发布的《企业级低代码开发平台技术要求》(T/SZAS 77—2024)为该领域提供了重要的规范与指引。深入剖析其核心要点,对于理…...
AI一键生成3D动画:腾讯最新方案,为小程序带来革命性变化
随着3D技术的快速发展,将静态的3D模型转化为能够生动展现各种动作的角色已经成为许多创作者和开发者梦寐以求的能力。然而,在过去,这一过程往往需要大量的手动工作和技术积累。现在,腾讯推出了一项创新的技术——AI一键生成3D动画,它不仅极大地简化了流程,还显著提高了效…...
AD软件如何快速切换三维视图,由2D切换至3D,以及如何恢复
在Altium Designer软件中,切换三维视图以及恢复二维视图的操作相对简单。以下是具体的步骤: 切换三维视图 在PCB设计界面中,2D切换3D,快捷键按住数字键盘中的“3”即可切换; 快捷键ctrlf(或者vb快捷键也…...
【赵渝强老师】PostgreSQL的数据库
PostgreSQL的逻辑存储结构主要是指数据库中的各种数据库对象,包括:数据库集群、数据库、表、索引、视图等等。所有数据库对象都有各自的对象标识符oid(object identifiers),它是一个无符号的四字节整数,相关对象的oid都…...
opencv 区域提取三种算法
opencv 区域提取三种算法 1.轮廓查找 findContours()函数,得到轮廓的点集集合 cv::vector<cv::vector<Point>> contours;threshold(roiMat,binImg,m_pPara.m_nMinGray,m_pPara.m_nMaxGray,THRESH_BINARY);//膨胀处理Mat dilaElement getStructuringE…...
C++初阶(十六)--STL--list的模拟实现
目录 结点类的实现 迭代器类的模拟实现 迭代器类的模板参数说明 构造函数 *运算符重载 ->运算符的重载 运算符的重载 --运算符重载 !运算符重载 运算符重载 list类的模拟实现 成员变量 默认成员函数 构造函数 拷贝构造函数 赋值运算符重载 迭代器相关函数 …...
树莓集团:以人工智能为核心,打造数字化生态运营新典范
在当今数字化浪潮席卷全球的背景下,各行各业都在积极探索数字化转型的路径。作为数字产业的领军者,树莓集团凭借其深厚的技术积累和创新理念,在人工智能、大数据、云计算等前沿技术领域不断突破,成功打造了一个以人工智能为核心的…...
基于深度学习的卷积神经网络十二生肖图像识别系统(PyQt5界面+数据集+训练代码)
本研究提出了一种基于深度学习的十二生肖图像识别系统,旨在利用卷积神经网络(CNN)进行图像分类,特别是十二生肖图像的自动识别。系统的核心采用了两种经典的深度学习模型:ResNet50和VGG16,进行图像的特征提…...
Torchtune在AMD GPU上的使用指南:利用多GPU能力进行LLM微调与扩展
Torchtune on AMD GPUs How-To Guide: Fine-tuning and Scaling LLMs with Multi-GPU Power — ROCm Blogs 这篇博客提供了一份详细的使用Torchtune在AMD GPU上微调和扩展大型语言模型(LLM)的指南。Torchtune 是一个PyTorch库,旨在让您轻松地…...
ESLint
代码规范 一套写代码的约定规则;比如赋值符号左右是否需要空格,一句话结束是否要加;.... 代码规范错误 如果你的代码不符合standard的要求,ESLint(脚手架里配的东西)会告诉你哪个文件第几行错了 解决代码…...
小程序-基于java+SpringBoot+Vue的微信小程序养老院系统设计与实现
项目运行 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:…...
如何具体实现商品详情的提取?
在电商领域,获取商品详情信息对于市场分析、价格比较、商品推荐等应用场景至关重要。本文将详细介绍如何使用Java编写爬虫程序,以合法合规的方式获取淘宝商品的详情信息,并提供详细的代码示例。 1. 环境准备 在开始编写爬虫之前,…...
antd table 自定义表头过滤表格内容
注意:该功能只能过滤可一次性返回全部数据的表格,通过接口分页查询的请自主按照需求改动哈~ 实现步骤: 1.在要过滤的列表表头增加过滤图标,点击图标显示浮窗 2.浮窗内显示整列可选选项,通过勾选单选或者全选、搜索框来…...
高效处理 iOS 应用中的大规模礼物数据:以直播项目为例(1-礼物池)
引言 在现代iOS应用开发中,处理大规模数据是一个常见的挑战。尤其实在直播项目中,礼物面板作为展示用户互动的重要部分,通常需要实时显示海量的礼物数据。这些数据不仅涉及到不同的区域、主播的动态差异,还需要保证高效的加载与渲…...
Maven - 优雅的管理多模块应用的统一版本号
文章目录 概述一、使用 versions-maven-plugin 插件1. 在主 pom.xml 中定义插件2. 修改版本号3. 回退修改4. 提交修改 二、使用占位符统一管理版本号1. 在主 pom.xml 中定义占位符2. 使用 flatten-maven-plugin 插件自动替换占位符3. 修改版本号4. 为什么这种方式更方便&#x…...
C++设计模式(观察者模式)
一、介绍 1.动机 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”,即一个对象的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵…...
【unity】WebSocket 与 EventSource 的区别
WebSocket 也是一种很好的选择,尤其是在需要进行 双向实时通信(例如聊天应用、实时数据流等)时。与 EventSource 不同,WebSocket 允许客户端和服务器之间建立一个持久的、全双工的通信通道。两者的区别和适用场景如下:…...
从ETL到DataOps:WhaleStudio替代Informatica,实现信创化升级
作者 | 白鲸开源 姜维 在数据集成和调度的领域,Informatica曾经是公认的权威工具。其强大的ETL功能、多年积累的市场经验,使其成为众多企业数据处理的核心工具。 然而,随着新一代大数据平台的迅速崛起,以及信创化改造的要求愈发严…...
第四十二篇 EfficientNet:重新思考卷积神经网络的模型缩放
文章目录 摘要1、简介2、相关工作3、复合模型缩放3.1、 问题公式化3.2、扩展维度3.3、复合比例 4、EfficientNet架构5、实验5.1、扩展MobileNets和ResNets5.2、EfficientNet的ImageNet结果5.3、EfficientNet的迁移学习结果 6、讨论7、结论 摘要 卷积神经网络(ConvNets)通常在固…...
[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker编译环境镜像下载以及使用方式
T. 已测试目录 主机类型主机版本Docker镜像版本结果WSL2Ubuntu22.04Ubuntu20.04PASSWSL2Ubuntu22.04Ubuntu18.04PASS R. 软硬件要求: 编译硬件需求:做多系统测试,磁盘500GB起步(固态)(机械会卡死),内存3…...
Web Worker 和 WebSocket的区别
Web Worker(消息传递机制) 定义:是为了在浏览器中提供多线程支持,允许 JavaScript 在后台线程运行,而不阻塞主线程。它非常适合执行耗时的计算任务或处理大量数据,避免主线程(通常是 UI 线程&a…...
vmware Ubuntu2004运行STAR-Searcher
github链接 安装ros noetic gazebo11 略 gazebo更新方法 sudo sh -c echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable lsb_release -cs main" > /etc/apt/sources.list.d/gazebo-stable.list wget https://packages.osrfoundation.org/gaz…...
04_JavaScript引入到文件
JavaScript引入到文件 嵌入到HTML文件中 <body> <script> var age 20 </script></body> 引入本地独立JS文件 <body> <script type"text/javascript" src"./itbaizhan.js"> </script></body> 引入网络来…...
计算机网络的功能
目录 信息交换 资源共享 分布式处理 可靠性增强 集中管理 信息交换 计算机网络最基本的功能之一是允许不同设备之间的数据通信。这包括电子邮件的发送和接收、即时消息的传递、文件传输等。通过网络,用户可以轻松地与全球各地的其他人进行沟通和协作。 信息交…...
38 基于单片机的宠物喂食(ESP8266、红外、电机)
目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机,采用L298N驱动连接P2.3和P2.4口进行电机驱动, 然后串口连接P3.0和P3.1模拟ESP8266, 红外传感器连接ADC0832数模转换器连接单片机的P1.0~P1.…...
Git仓库迁移到远程仓库(源码、分支、提交)
单个迁移仓库 一、迁移仓库 1.准备工作 > 手动在电脑创建一个临时文件夹,CMD进入该目录 > 远程仓库上创建一个同名的空仓库 2.CMD命令:拉取旧Git仓库(包含提交、分支、源码) $ git clone --bare http://git.domain.cn/…...
Go语言压缩文件处理
目录 Go 语言压缩文件处理1. 压缩文件:Zip函数2. 解压文件:UnZip 函数3. 小结 Go 语言压缩文件处理 在现代的应用开发中,处理压缩文件(如 .zip 格式)是常见的需求。Go 语言提供了内置的 archive/zip 包来处理 .zip 文…...
Libevent库-http通信不同请求方式的处理
做项目的时候用到了http通信,同事用libevent库写的,特此记录后端从前端拿到消息后的处理方式 void CHTTPTest::request(const std::any & data) {// data 是从前端拿到的数据void *obj std::any_cast<void *>(data); // std::any是C17新标准…...
Vue3 v-if与v-show的区别
v-if 与 v-show 我们都可以在开发中用于条件渲染,在面试时也是个常考的题目 实现原理 v-if:是真正的条件渲染,当v-if true时,元素会被创建、渲染,并插入到dom树中,这个过程会耗费系统的资源,当…...
同时在github和gitee配置密钥
同时在github和gitee配置密钥 1. 生成不同的 SSH 密钥 为每个平台生成单独的 SSH 密钥。 # 为 GitHub 生成密钥(默认文件路径为 ~/.ssh/github_id_rsa) ssh-keygen -t rsa -b 4096 -C "your_github_emailexample.com" -f ~/.ssh/github_id_…...
Scala—数组(不可变数组Array、可变数组ArrayBuffer)用法详解
Scala集合概述-链接 大家可以点击上方链接,先对Scala的集合有一个整体的概念🤣🤣🤣 在 Scala 中,数组是一种特殊的集合类型,可以是可变的也可以是不可变的。 1. 不可变数组 在 Scala 中,不可变…...
Failed to find SV in PRN block of SINEX file (Name svnav.dat)
gamit 精密星历生成失败 gamit svnav.dat没更新 下载svnav.dat.allgnss 重命名成 svnav.dat ,替换到tables,即可。...
H.265流媒体播放器EasyPlayer.js无插件H5播放器关于移动端(H5)切换网络的时候,播放器会触发什么事件
EasyPlayer.js无插件H5播放器作为一款功能全面的H5流媒体播放器,凭借其多种协议支持、多种解码方式、丰富的渲染元素和强大的应用功能,以及出色的跨平台兼容性,为用户提供了高度定制化的选项和优化的播放体验。无论是视频直播还是点播&#x…...
Ubuntu上使用自带python创建虚拟环境
虚拟环境让项目之间的依赖关系更加清晰,也可以避免全局安装的包的版本冲突问题。 1.查看python Ubuntu上一般都是自带python的,查看python版本及指向(使用的话python要换成python3): ls -l /usr/bin | grep python 2.安装python虚拟环境工…...