【设计模式】- 行为型模式1
模板方法模式
定义了一个操作中的算法骨架,将算法的一些步骤推迟到子类,使得子类可以不改变该算法结构的情况下重定义该算法的某些步骤
【主要角色
】:
- 抽象类:给出一个算法的轮廓和骨架(包括一个模板方法 和 若干基本方法)
- 模板方法:定义了算法的骨架(执行顺序),按某种顺序调用其包含的基本方法
- 基本方法:实现算法各个步骤的方法
- 抽象方法:由抽象类声明,具体子类实现
- 具体方法:由抽象类或具体类声明或实现,子类可以覆盖也可以继承
- 钩子方法:在抽象类中已经实现,包含用于判断的逻辑方法和需要子类重写的空方法(一般是用于判断的逻辑方法,方法名为isXxx,返回值为boolean类型)
- 具体子类:实现抽象类中所定义的抽象方法和钩子方法
案例:炒菜
【需求
】:炒菜的步骤是固定的,分为倒油、热油、倒蔬菜、倒调料品、翻炒等步骤。
抽象类(定义模板方法和基本方法):
public abstract class AbstractClass {// 模板方法定义(子类不能修改模板方法)public final void cookProcess() {pourOil();heatOil();pourVegetable();pourSauce();fry();}public void pourOil() {System.out.println("倒油");}public void heatOil() {System.out.println("热油");}// 倒蔬菜(一个是包菜、一个是菜心)public abstract void pourVegetable();// 倒调味品public abstract void pourSauce();public void fry() {System.out.println("翻炒");}
}
炒包菜类、炒菜心类(具体子类):
public class ConcreteClassBaoCai extends AbstractClass {@Overridepublic void pourVegetable() {System.out.println("下锅的蔬菜是包菜");}@Overridepublic void pourSauce() {System.out.println("下锅的酱料是辣椒");}
}public class ConcreteClassCaiXin extends AbstractClass {@Overridepublic void pourVegetable() {System.out.println("下锅的蔬菜是菜心");}@Overridepublic void pourSauce() {System.out.println("下锅的酱料是蒜蓉");}
}
测试类:
public class Client {public static void main(String[] args) {// 创建对象AbstractClass baoCai = new ConcreteClassBaoCai();// 调用炒菜功能baoCai.cookProcess();}
}
将相同的代码放在抽象的父类中,把不同的代码放入不同的子类中。
适用场景
- 算法的整体部分比较固定,个别部分容易改变,就可以使用模板方法,将容易变化的部分抽象出来,让子类去实现这些方法。
- 通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。
策略模式
该模式定义了一系列算法, 使他们可以互相替换,算法的变化不会影响使用算法的客户。
【主要角色
】:
- 抽象策略类:由一个接口或抽象类实现,给出所有具体策略所需的接口
- 具体策略类:实现了抽象策略类定义的接口,提供具体的算法实现或行为
- 环境类:持有一个策略类的引用,最终给客户端调用
案例:促销活动
【需求
】:超市争对不同的节日(春节、中秋节、圣诞节)推出不同的促销活动,由促销员(环境类)将促销活动展示给客户。
抽象策略类:
public interface Strategy {void show();
}
策略A、B、C类(具体策略类):
public class StrategyA implements Strategy {@Overridepublic void show() {System.out.println("买一送一");}
}public class StrategyB implements Strategy {@Overridepublic void show() {System.out.println("满200减50");}
}public class StrategyC implements Strategy {@Overridepublic void show() {System.out.println("打8折");}
}
销售员类(环境类):
public class SalesMan {private Strategy strategy;public SalesMan(Strategy strategy) {this.strategy = strategy;}// 由促销员展示促销活动给普通用户public void salesManShow() {strategy.show();}
}
测试类:
public class Client {public static void main(String[] args) {// 切换策略ASalesMan salesMan = new SalesMan(new StrategyA());salesMan.salesManShow();// 切换策略BsalesMan = new SalesMan(new StrategyB());salesMan.salesManShow();// 切换策略CsalesMan = new SalesMan(new StrategyC());salesMan.salesManShow();}
}
策略类之间可以自由切换;
增加一个新的策略只需要添加一个具体的策略类
策略模式可以避免使用多重的if else 和 switch case
适用场景
- 需要动态在几种算法中选择一种,可以把每个算法封装到策略类中
- 大量的if else和switch cash完全可以用策略模式代替,让代码更加美观优雅
命令模式
将请求封装成一个对象,使发出请求的责任和执行请求的责任分隔开,这样两者之间通过命令对象进行沟通,方便将命令对象进行存储、传递、调用、增加、管理。
【主要角色
】
- 抽象命令角色:定义命令的接口,声明执行方法
- 具体命令角色:实现命令接口,通常会持有接收者,并调用接收者的功能来完成命令要执行的操作
- 实现者 / 接收者角色:真正执行命令的对象
- 调用者 / 请求者角色:要求命令对象执行请求,通常会持有命令对象
案例:点餐
- 服务员:调用者角色,由服务员发起命令
- 厨师:接收者命令,真正命令执行的对象
- 订单:命令中包含订单
订单类:
@Data
public class Order {// 餐桌号码private int diningTable;// 所下餐品和份数private Map<String, Integer> foodDir = new HashMap<>();// 添加食物public void addFood(String name, int num) {foodDir.put(name, num);}
}
厨师类(接收者):
public class Chef {// 制作食物public void makeFood(String name, int num) {System.out.println(num + "份" + name);}
}
抽象命令类:
public interface Command {void execute();
}
具体命令类:
public class OrderCommand implements Command {// 持有接收者对象private Chef receiver;private Order order;public OrderCommand(Chef receiver, Order order) {this.receiver = receiver;this.order = order;}@Overridepublic void execute() {System.out.println(order.getDiningTable() + "桌的订单:");Map<String, Integer> foodDir = order.getFoodDir();foodDir.forEach((foodName, num)->{receiver.makeFood(foodName, num); // 让厨师去完成订单里的菜品});System.out.println(order.getDiningTable() + "桌的饭准备完毕");}
}
服务员类(调用者角色):
public class Waitor {// 持有多个命令对象private List<Command> commands = new ArrayList<>();public void addCommand(Command command) {// 将command存储到List集合中commands.add(command);}// 发起命令public void orderUp() {System.out.println("服务员:厨师,订单来啦");commands.forEach(command -> {if(command != null) command.execute();});}
}
测试类:
public class Client {public static void main(String[] args) {// 创建第一个订单对象Order order1 = new Order();order1.setDiningTable(1);order1.addFood("西红柿鸡蛋面", 1);order1.addFood("小杯可乐", 2);// 创建第二个订单对象Order order2 = new Order();order2.setDiningTable(2);order2.addFood("油闷大虾", 1);order2.addFood("小杯雪碧", 1);// 创建厨师对象Chef receiver = new Chef();// 创建命令对象OrderCommand cmd1 = new OrderCommand(receiver, order1);OrderCommand cmd2 = new OrderCommand(receiver, order2);// 创建调用者Waitor invoke = new Waitor();invoke.addCommand(cmd1);invoke.addCommand(cmd2);// 让服务员发起命令invoke.orderUp();}
}
适用场景
- 系统需要将请求调用这和请求接收者解耦
- 系统需要在不同时间指定请求、将请求排队和执行请求
- 系统需要支持命令的撤销(undo)和恢复(redo)操作
JDK源码解析:Runnable类
Runnable类就是一个命令模式,Thread是调用者,start()方法就是执行方法
责任链模式
避免发送者和多个请求处理者耦合在一起,将所有请求的处理者通过钱一个对象记住其下一个对象的引用而连成一条链;当请求发生时,可以将请求沿着这条链传递,直到有对象处理它为止
【
问题
】公司员工请假,可以批假的领导有:部门负责人、副总经理、总经理,但是每个领导可以批准的天数不同。员工需要根据自己要请假的天数去找不同的领导签字。
【解决
】:比如有个员工要请假,他只需要去找部门负责人,如果部门负责人发现他请假的时间自己处理不了,就会把这个请假单交给副总经理,如果副总经理处理不了,就会交给总经理处理。
【主要角色
】:
- 抽象处理者角色:定义一个处理请求的接口,包含抽象处理方法和后继处理方法
- 具体处理者角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理就处理;如果不能处理就把它转发给后继的处理者
- 客户类角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程
案例:请假流程
【需求
】:请假一天以下的只需要小组长同意;请假1-3天需要部门经理同意;请假3-7天需要总经理同意。
请假条类:
@AllArgsConstructor
@Data
public class LeaveRequest {// 姓名private String name;// 请假天数private int num;// 请假内容private String content;
}
抽象处理者类:
@Data
public abstract class Handler {protected final static int NUM_ONE = 1;protected final static int NUM_THREE = 3;protected final static int NUM_SEVEN = 7;// 领导了可以处理的天数区间private int numStart;private int numEnd;public Handler(int numStart, int numEnd) {this.numStart = numStart;this.numEnd = numEnd;}// 声明后继者(上级领导)private Handler nextHandler;// 各级领导处理请假条的方法protected abstract void handleLeave(LeaveRequest leave);// 提交请假条(不能被继承)public final void submit(LeaveRequest leave) {// 该领导审批handleLeave(leave);if(nextHandler != null && leave.getNum() > numEnd) {// 交给上级领导审批nextHandler.handleLeave(leave);} else {System.out.println("流程结束");}}
}
小组长类、部门经理类、总经理类(具体的处理者)
public class GroupLeader extends Handler {public GroupLeader() {super(0, Handler.NUM_ONE);}@Overrideprotected void handleLeave(LeaveRequest leave) {System.out.println(leave.getName() + "请假" + leave.getNum() + "天,原因:" + leave.getContent());System.out.println("小组长审批:同意");}
}public class Manager extends Handler {public Manager() {super(Handler.NUM_ONE, Handler.NUM_THREE);}@Overrideprotected void handleLeave(LeaveRequest leave) {System.out.println(leave.getName() + "请假" + leave.getNum() + "天,原因:" + leave.getContent());System.out.println("部门经理审批:同意");}
}public class GeneralManager extends Handler {public GeneralManager() {super(Handler.NUM_THREE, Handler.NUM_SEVEN);}@Overrideprotected void handleLeave(LeaveRequest leave) {System.out.println(leave.getName() + "请假" + leave.getNum() + "天,原因:" + leave.getContent());System.out.println("总经理类审批:同意");}
}
测试类:
public class Client {public static void main(String[] args) {// 1. 创建请假条对象LeaveRequest leave = new LeaveRequest("小明", 1, "身体不适");// 2. 创建各级领导对象GroupLeader groupLeader = new GroupLeader();Manager manager = new Manager();GeneralManager generalManager = new GeneralManager();// 3. 设置处理者链groupLeader.setNextHandler(manager);manager.setNextHandler(generalManager);// 4. 小明提交请假groupLeader.submit(leave); // 调用小组长里的submit()方法}
}
降低了请求发送者 和 请求接收者的耦合度
每个类只需要处理自己该处理的工作,不能处理的传递给下一个对象完成
相关文章:
【设计模式】- 行为型模式1
模板方法模式 定义了一个操作中的算法骨架,将算法的一些步骤推迟到子类,使得子类可以不改变该算法结构的情况下重定义该算法的某些步骤 【主要角色】: 抽象类:给出一个算法的轮廓和骨架(包括一个模板方法 和 若干基…...
容器化-k8s-使用和部署
一、K8s 使用 1、基本概念 集群: 由 master 节点和多个 slaver 节点组成,是 K8s 的运行基础。节点: 可以是物理机或虚拟机,是 K8s 集群的工作单元,运行容器化应用。Pod: K8s 中最小的部署单元,一个 Pod 可以包含一个或多个紧密相关的容器,这些容器共享网络和存储资源。…...
黑马k8s(九)
1.Pod-生命周期概述 2.Pod生命周期-创建和终止 3.Pod生命周期-初始化容器...
Android trace中CPU的RenderThread与GPU
Android trace中CPU的RenderThread与GPU RenderThread是系统的GPU绘制线程,GPU渲染就是通常所谓的硬件加速,如果应用关闭硬件加速,就没有了RenderThread,只有UI Thread,即Android主线程。 Android GPU渲染SurfaceFlin…...
测试工程师如何学会Kubernetes(k8s)容器知识
Kubernetes(K8s)作为云原生时代的关键技术之一,对于运维工程师、开发工程师以及测试工程师来说,都是一门需要掌握的重要技术。作为一名软件测试工程师,学习Kubernetes是一个有助于提升自动化测试、容器化测试以及云原生应用测试能力的重要过程…...
接触感知 钳位电路分析
以下是NG板接触感知电路的原理图。两极分别为P3和P4S,电压值P4S < P3。 电路结构分两部分,第一部分对输入电压进行分压钳位。后级电路使用LM113比较器芯片进行电压比较,输出ST接触感知信号。 钳位电路输出特性分析 输出电压变化趋势&a…...
码蹄集——圆包含
MT1181 圆包含 输入2个圆的圆心的坐标值(x,y)和半径,判断断一个圆是否完全包含另一个圆,输出YES或者NO。另:内切不算做完全包含。 格式 输入格式:输入整型,空格分隔。 每行输入一组…...
ConcurrentSkipListMap的深入学习
目录 1、介绍 1.1、线程安全 1.2、有序性 1.3、跳表数据结构 1.4、API 提供的功能 1.5、高效性 1.6、应用场景 2、数据结构 2.1、跳表(Skip List) 2.2、节点类型: 1.Node 2.Index 3.HeadIndex 2.3、特点 3、选择层级 3.1、随…...
ProfibusDP主站转modbusTCP网关接DP从站网关通讯案例
ProfibusDP主站转modbusTCP网关接DP从站网关通讯案例 在工业自动化领域,Profibus DP和Modbus TCP是两种常见的通信协议。Profibus DP广泛应用于过程自动化、工厂自动化等场景,而Modbus TCP则常见于楼宇自动化、能源管理等领域。由于设备和系统之间往往存…...
第一次做逆向
题目来源:ctf.show 1、下载附件,发现一个exe和一个txt文件 看看病毒加没加壳,发现没加那就直接放IDA 放到IDA找到main主函数,按F5反编译工具就把他还原成类似C语言的代码 然后我们看逻辑,将flag.txt文件的内容进行加…...
【项目】自主实现HTTP服务器:从Socket到CGI全流程解析
00 引言 在构建高效、可扩展的网络应用时,理解HTTP服务器的底层原理是一项必不可少的技能。现代浏览器与移动应用大量依赖HTTP协议完成前后端通信,而这一过程的背后,是由网络套接字驱动的请求解析、响应构建、数据传输等一系列机制所支撑…...
AI最新资讯,GPT4.1加入网页端、Claude 3.7 Sonnet携“极限推理”发布在即
目录 一、GPT4.1加入网页端二、Claude 3.7 Sonnet携“极限推理”发布在即三、这项功能的关键特点1、双模式操作2、可视化思考过程3、可控的思考预算4、性能提升 四、Claude制作SVG图像1、Prompt提示词模板2、demo:技术路线图**Prompt提示词:**3、甘特图4…...
Android 中使用通知(Kotlin 版)
1. 前置条件 Android Studio:确保使用最新版本(2023.3.1)目标 API:最低 API 21,兼容 Android 8.0(渠道)和 13(权限)依赖库:使用 WorkManager 和 Notificatio…...
在 Kotlin 中,什么是解构,如何使用?
在 Kotlin 中,解构是一种语法糖,允许将一个对象分解为多个独立的变量。 这种特性可以让代码更简洁、易读,尤其适用于处理数据类、集合(如 Pair、Map)或其他结构化数据。 1 解构的核心概念 解构通过定义 componentN()…...
apisix透传客户端真实IP(real-ip插件)
文章目录 apisix透传客户端真实IP需求和背景apisix real-ip插件为什么需要 trusted_addresses?安全架构的最佳实践 示例场景apisix界面配置 apisix透传客户端真实IP 需求和背景 当 APISIX 前端有其他反向代理(如 Nginx、HAProxy、云厂商的 LBÿ…...
初学者如何用 Python 写第一个爬虫?
初学者如何用 Python 写第一个爬虫? 一、爬虫的基本概念 (一)爬虫的定义 爬虫,英文名为 Web Crawler,也被叫做网络蜘蛛、网络机器人。想象一下,有一个勤劳的小蜘蛛,在互联网这个巨大的蜘蛛网中…...
基于MNIST数据集的手写数字识别(CNN)
目录 一,模型训练 1.1 数据集介绍 1.2 CNN模型层结构 1.3 定义CNN模型 1.4 神经网络的前向传播过程 1.5 数据预处理 1.6 加载数据 1.7 初始化 1.8 模型训练过程 1.9 保存模型 二,模型测试 2.1 定义与训练时相同的CNN模型架构 2.2 图像的预处…...
QT6 源(103)篇三:阅读与注释 QPlainTextEdit,给出源代码
(10)关于文本处理的内容很多,来不及全面阅读、思考与整理。先给出类的继承图: (11)本源代码来自于头文件 qplaintextedit . h : #ifndef QPLAINTEXTEDIT_H #define QPLAINTEXTEDIT_H#include &…...
yocto5.2开发任务手册-7 升级配方
此文为机器辅助翻译,仅供个人学习使用,如有翻译不当之处欢迎指正 7 升级配方 随着时间的推移,上游开发者会为图层配方构建的软件发布新版本。建议使配方保持与上游版本发布同步更新。 虽然有多种升级配方的方法,但您可能需要先…...
LangPDF: Empowering Your PDFs with Intelligent Language Processing
LangPDF: Empowering Your PDFs with Intelligent Language Processing Unlock Global Communication: AI-Powered PDF Translation and Beyond In an interconnected world, seamless multilingual document management is not just an advantage—it’s a necessity. LangP…...
DDS(数据分发服务) 和 P2P(点对点网络) 的详细对比
1. 核心特性对比 维度 DDS P2P 实时性 微秒级延迟,支持硬实时(如自动驾驶) 毫秒至秒级,依赖网络环境(如文件传输) 架构 去中心化发布/订阅模型,节点自主发现 完全去中心化,节…...
TC8:SOMEIP_ETS_029-030
SOMEIP_ETS_029: echoUINT8Array16Bitlength 目的 检查当method echoUINT8Array16BitLength的参数中长度字段为16bit时,SOME/IP协议层是否能对参数进行序列化和反序列化。 对于可变长度的数组而言,必须用长度字段表示数组长度。否则接收方无法判断有效数据。 SOMEIP_ETS_02…...
Elasticsearch索引全生命周期管理指南之一
#作者:猎人 文章目录 一、索引常规操作二、索引mapping和别名管理 一、索引常规操作 索引数据特点: 索引中的数据随着时间,持续不断增长 按照时间序列划分索引的好处&挑战: 按照时间进行划分索引,会使得管理更加…...
本土DevOps革命:Gitee如何撬动中国企业的数字化转型新动能
在数字化浪潮席卷全球的背景下,中国企业正面临前所未有的转型压力与机遇。随着《数据安全法》和《个人信息保护法》的全面实施,以及信创产业政策的深入推进,研发工具链的自主可控已成为关乎企业核心竞争力的战略命题。在这一关键赛道上&#…...
ARM服务器解决方案
ARM服务器解决方案已成为异构计算领域的重要技术路径,其核心优势与多元化场景适配性正加速产业渗透。以下为关键要点分析: 一、核心优势与架构设计 能效比优化 ARM架构基于RISC指令集,单节点功耗可控制在15W以下,较x86架构能效…...
【暗光图像增强】【基于CNN的方法】2020-AAAI-EEMEFN
EEMEFN:Low-Light Image Enhancement via Edge-Enhanced Multi-Exposure Fusion Network EEMEFN:基于边缘增强多重曝光融合网络的低光照图像增强 AAAI 2020 论文链接 0.论文摘要 本研究专注于极低光照条件下的图像增强技术,旨在提升图像亮度…...
嵌入式EasyRTC音视频实时通话SDK在工业制造领域的智能巡检/AR协作等应用
一、背景 在数字化浪潮席卷全球的当下,远程监控与驾驶技术已深度渗透至工业巡检、智能交通等核心领域。然而,传统方案普遍面临实时性瓶颈、高延迟传输及交互体验匮乏等痛点,严重制约行业智能化转型。EasyRTC作为前沿的实时音视频通信技术&am…...
uniapp-商城-58-后台 新增商品(属性子级的添加和更新)
前面对父级属性的添加进行了分析,这里再来继续做属性子级的数据添加,包含页面逻辑以及后台处理的逻辑。当然这里还是在前面的云对象的方式进行的。 本文介绍了在云对象green-mall-sku中添加子级属性的实现过程。首先,通过updateChild接口处理…...
基于springboot+vue的机场乘客服务系统
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7数据库工具:Navicat12开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9 系统展示 用户管理 航班信…...
npm和nvm和nrm有什么区别
npm 全称:Node Package Manager。 作用: 包管理:用于安装、共享、分发代码,管理项目依赖关系。项目管理:创建和管理 package.json 文件,记录项目依赖和配置信息。脚本执行:运行项目中的脚本&…...
几种排序方式的C语言实现(冒泡、选择、插入、希尔等)
## 分类 存储器类型: - 内排序(数据规模小 内存) - 外排序(数据库 磁盘) 是否基于元素之间的比较 - 基数排序 - 其他排序:冒泡、选择、插入、快速、归并、希尔、堆…… 时间复杂度 - O&#…...
【MATLAB例程】线性卡尔曼滤波的程序,三维状态量和观测量,较为简单,可用于理解多维KF,附代码下载链接
本文所述代码实现了一个 三维状态的扩展卡尔曼滤波 (Extended Kalman Filter, EKF) 算法。通过生成过程噪声和观测噪声,对真实状态进行滤波估计,同时对比了滤波前后状态量的误差和误差累积分布曲线。 文章目录 简介运行结果MATLAB源代码 简介 代码分为以…...
芯片测试之X-ray测试
原理: X-ray是利用阴极射线管产生高能量电子与金属靶撞击,在撞击过程中,因电子突然减速,其损失的动能会以X-Ray形式放出。而对于样品无法以外观方式观测的位置,利用X-Ray穿透不同密度物质后其光强度的变化,…...
机器学习中的特征工程:解锁模型性能的关键
在机器学习领域,模型的性能往往取决于数据的质量和特征的有效性。尽管深度学习模型在某些任务中能够自动提取特征,但在大多数传统机器学习任务中,特征工程仍然是提升模型性能的关键环节。本文将深入探讨特征工程的重要性、常用方法以及在实际…...
【学习笔记】机器学习(Machine Learning) | 第七章|神经网络(1)
机器学习(Machine Learning) 简要声明 基于吴恩达教授(Andrew Ng)课程视频 BiliBili课程资源 文章目录 机器学习(Machine Learning)简要声明 机器学习之深度学习神经网络入门一、神经网络的起源与发展二、神经元模型(…...
反向传播算法:神经网络的核心优化方法,一文打通任督二脉
搞神经网络训练,**反向传播(Backpropagation)**是最核心的算法。 没有它,模型就只能瞎猜参数,训练基本白搭。 这篇文章不整公式推导,不搞花架子,咱就把最关键的几个问题讲明白: 反向传播到底是干啥的? 它是怎么一步步更新参数的? 哪些坑你必须避免? 一、反向传播是…...
neo4j框架:java安装教程
安装使用neo4j需要事先安装好java,java版本的选择是一个犯难的问题。本文总结了在安装java和使用Java过程中遇到的问题以及相应的解决方法。 Java的安装包可以在java官方网站Java Downloads | Oracle 中国进行下载 以java 8为例,选择最后一行的x64 compr…...
基于React的高德地图api教程007:椭圆的绘制、编辑和删除
文章目录 7、椭圆绘制7.1 绘制椭圆7.1.1 设置圆心7.1.2 确定短半轴7.1.3 确定长半轴7.1.4 实时显示椭圆形状7.2 修改椭圆7.2.1 修改椭圆属性信息7.2.2 修改椭圆形状7.3 删除椭圆7.4 定位椭圆7.5 代码下载7.07、椭圆绘制 7.1 绘制椭圆 7.1.1 设置圆心 第一次点击地图设置圆心…...
Python多线程实战:提升并发效率的秘诀
一、前言:为什么需要多任务处理? 在实际开发中,我们经常需要让程序同时执行多个任务,例如: 同时下载多个文件;在后台运行耗时计算的同时保持界面响应;并发处理网络请求等。 Python 提供了多种…...
将嵌入映射到 Elasticsearch 字段类型:semantic_text、dense_vector、sparse_vector
作者: Andre Luiz 讨论如何以及何时使用 semantic_text、dense_vector 或 sparse_vector,以及它们与嵌入生成的关系。 通过这个自定进度的 Search AI 实践学习亲自体验向量搜索。你可以开始免费云试用,或者在本地机器上尝试 Elastic。 多年来…...
RabbitMQ 消息模式实战:从简单队列到复杂路由(四)
模式对比与选择 各模式特点对比 简单队列模式:结构最为简单,生产者直接将消息发送到队列,消费者从队列中获取消息,实现一对一的消息传递。其优势在于易于理解和实现,代码编写简单,适用于初学者和简单业务…...
OpenCV CUDA模块中矩阵操作------归一化与变换操作
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 OpenCV 的 CUDA 模块中,normalize 和 rectStdDev 函数用于对矩阵进行归一化处理和基于积分图计算矩形区域的标准差。 函数介绍 …...
1Panel应用推荐:Beszel轻量级服务器监控平台
1Panel(github.com/1Panel-dev/1Panel)是一款现代化、开源的Linux服务器运维管理面板,它致力于通过开源的方式,帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用,1Panel特别开通应用商店&am…...
谷歌地图代理 | 使用 HTML 和矢量模式 API 更轻松地创建 Web 地图
在过去的一年里,谷歌对 Maps JavaScript API 进行了两项重要更新,以便更轻松地采用我们最新、最好的地图:HTML 地图和矢量模式 API。今天谷歌地图亚太区最大代理商之一的 Cloud Ace云一 为大家介绍一下更新的具体内容。 联系我们 - Cloud Ac…...
最新开源 TEN VAD 与 Turn Detection 让 Voice Agent 对话更拟人 | 社区来稿
关键词:对话式 AI | 语音智能体 | Voice Agent | VAD | 轮次检测 | 声网 | TEN GPT-4o 所展示对话式 AI 的新高度,正一步步把我们在电影《Her》中看到的 AI 语音体验变成现实。AI 的语音交互正在变得更丰富、更流畅、更易用,成为构建多模态智…...
「Mac畅玩AIGC与多模态40」开发篇35 - 用 Python 开发服务对接 SearxNG 与本地知识库
一、概述 本篇介绍如何使用 Python 构建一个集成本地聚合搜索引擎 SearxNG 与本地知识库的双通道服务接口,返回标准结构化 JSON 数据,并用于对接智能体插件系统。该接口适用于本地 Agent 应用开发与 Dify 插件集成场景。 二、目标说明 使用 Flask 实现…...
【Boost搜索引擎】构建Boost站内搜索引擎实践
目录 1. 搜索引擎的相关宏观原理 2. 正排索引 vs 倒排索引 - 搜索引擎具体原理 3. 编写数据去标签与数据清洗的模块 Parser 去标签 编写parser 用boost枚举文件名 解析html 提取title 编辑 去标签 构建URL 将解析内容写入文件中 4. 编写建立索引的模块 Index 建…...
记参加一次数学建模
题目请到全国大学生数学建模竞赛下载查看。 注:过程更新了很多文件,所有这里贴上的有些内容不是最新的(而是草稿)。 注:我们队伍并没有获奖,文章内容仅供一乐。 从这次比赛,给出以下赛前建议 …...
【gRPC】HTTP/2协议,HTTP/1.x中线头阻塞问题由来,及HTTP/2中的解决方案,RPC、Protobuf、HTTP/2 的关系及核心知识点汇总
HTTP/2协议特点 gRPC基于HTTP/2协议,原因: 多路复用:允许在同一个TCP连接上并行传输多个请求和响应,即多个gRPC调用可以通过同一个连接同时进行,避免了HTTP/1.x中常见的线头阻塞问题,减少了连接建立和关闭…...
mac中加载C++动态库文件
前言 需要再mac系统下运行C开发的程序,通过摸索,初步实现了一版,大致记录下 1. 前提准备 安装OpenCV 使用Homebrew安装OpenCV: brew install opencv确认安装路径: brew --prefix opencv默认路径为/opt/homebrew/…...