设计模式の建造者适配器桥接模式
文章目录
- 前言
- 一、建造者模式
- 二、适配器模式
- 2.1、对象适配器
- 2.2、接口适配器
- 三、桥接模式
前言
本篇是关于设计模式中建造者模式、适配器模式(3种)、以及桥接模式的笔记。
一、建造者模式
建造者模式是属于创建型设计模式
,通过一步步构建一个复杂对象的方式,隐藏复杂的构造过程使得对象的创建过程更加灵活、易于扩展,同时不需要指定具体的构造方式。
其组成部分有:
- 产品:表示被建造的对象。
- 抽象建造者:通常是抽象类或接口,定义了创建产品所需要的方法,由不同的子类去描述建造不同产品的
具体步骤
。 - 指挥者:组合了建造者对象,通常是将建造者对象作为其属性,提供方法控制
建造的过程
,指挥建造者完成特定的构建步骤。 - 具体建造者:继承/实现抽象建造者,重写其中的方法,描述不同产品的建造步骤。
为什么要使用建造者模式?我们可以看一个例子,假设现在需要建一所房子,用一个实体类封装房子的属性:
/*** 不管是 高层,洋房,还是别墅 都有 固定的这些属性*/
public class House {private String basic;private String wall;private String roof;public House() {}public House(String basic, String wall, String roof) {this.basic = basic;this.wall = wall;this.roof = roof;}//....get set 方法
}
客户端直接完成对房子的创建,这样做很明显是存在弊端的。因为房子的种类有很多种,每一种的建造过程也是不一样的,虽然都包含一些共有的属性:
public class Client {public static void main(String[] args) {House house = new House();house.setBasic("打地基");house.setWall("砌墙");house.setRoof("盖屋顶");//--------如果有不同的房子要建立呢?---------------// 伪代码
// if (type.equals("别墅")){
// house.setBasic("打别墅的地基");
// house.setWall("砌别墅的墙");
// house.setRoof("盖别墅的屋顶");
// }else {
// house.setBasic("打高层的地基");
// house.setWall("砌高层的墙");
// house.setRoof("盖高层的屋顶");
// }//--------如果后续对于工序还有不同的要求呢?---------------}
}
使用建造者模式改进:
- 引入一个房子的建造者,定义了建不同房子都必须有的共有的工序:
/*** 房子的建造者*/
public abstract class CommonHouseBuilder {protected House house = new House();abstract void buildBasic();abstract void buildWalls();abstract void buildRoof();/*** 返回建造好的房子* @return*/public House getHouse() {return house;}}
- 具体的产品实现类,代表建立不同类型的房子:
public class HighRise extends CommonHouseBuilder{@Overridevoid buildBasic() {System.out.println("高层地基");}@Overridevoid buildWalls() {System.out.println("高层砌墙");}@Overridevoid buildRoof() {System.out.println("高层封顶");}
}
public class Villa extends CommonHouseBuilder{@Overridevoid buildBasic() {house.setBasic("别墅打基础");}@Overridevoid buildWalls() {house.setWall("别墅砌墙");}@Overridevoid buildRoof() {house.setRoof("别墅封顶");}
}
- 引入指挥者,指定建造的顺序:
/*** 建房子的指挥者*/
public class HouseBuildCommander {CommonHouseBuilder commonHouseBuilder;public HouseBuildCommander(CommonHouseBuilder commonHouseBuilder) {this.commonHouseBuilder = commonHouseBuilder;}public HouseBuildCommander() {}/*** 建造房子* @return*/public House constructHouse() {commonHouseBuilder.buildBasic();commonHouseBuilder.buildWalls();commonHouseBuilder.buildRoof();return commonHouseBuilder.getHouse();}}
- 客户端只需要让指挥者去指挥建造需要的房子即可:
public class Client {public static void main(String[] args) {//让指挥者 建造别墅HouseBuildCommander houseBuildCommander = new HouseBuildCommander(new Villa());House house = houseBuildCommander.constructHouse();System.out.println(house);}
}
House{basic = 别墅打基础, wall = 别墅砌墙, roof = 别墅封顶}
从改造后的案例,不难看出,建造者模式,一般适用于产品建造过程
有较多共同点的情况,例如上面的案例,无论是建别墅,高层也好,都需要经过打基础,砌墙,封顶的过程,只是不同的房子具体的工艺不一样。如果产品之间建造过程差异很大,比如建房子和建桥,那么就不适合使用建造者模式。并且建造者模式
,和抽象工厂模式
的区别在于,建造者模式注重创建产品的过程,而抽象工厂模式,强调的是通过提供一个统一的接口来创建这些产品系列,而不关心具体实现。
- 如果你需要创建一组相关的产品,使用抽象工厂模式;
- 如果你需要按步骤创建一个复杂对象,使用建造者模式。
二、适配器模式
适配器模式是一种结构型设计模式
,适用于一个类的接口转换成客户端希望的另一个接口。通过适配器模式,可以让原本因接口不兼容而无法一起工作的类协同工作。
也可以用生活中的一个案例说明,例如有些笔记本电脑是支持直接插入网线的:
而有一些则没有网线接口,只有usb插槽,则需要在网线和usb插槽之间使用一个
转接器
:
通过转接器,便可以实现有线上网的方式。这里的转接器就是
适配器
的体现(在网线和usb插槽之间作为缓冲层,对两者进行适配转换)。
由此可知,适配器模式的主要角色有:
- 目标接口:客户端希望使用的接口。
- 源接口:需要被适配的接口,通常是一个现有的类或库,但它的接口与客户端不兼容。
- 适配器:实现目标接口的类,它将源接口转化为目标接口。
如果体现在代码中,适配器模式分为类适配器
,对象适配器
,接口适配器
三种体现,其中类适配器
的适配器类,是使用继承被适配类,实现适配类的形式,不够灵活,所以不再记录。
2.1、对象适配器
目前笔记本电脑有一个usb,无法直接插上网线:
public class Usb {public String outputUsb(){String type = "usb接口";System.out.println("向外提供"+type);return type;}
}
网线接口:
public interface NetworkCable {String outputNetworkCable();
}
通过适配器,使网线可以通过usb接口正常工作:
public class Adapt implements NetworkCable{private Usb usb;public Adapt(Usb usb) {this.usb = usb;}@Overridepublic String outputNetworkCable() {String usb = this.usb.outputUsb();System.out.println("将usb接口转接为网线接口");return "网线接口";}
}
public class Computer {public void connectInternet(NetworkCable networkCable){if (networkCable.outputNetworkCable().equals("网线接口")){System.out.println("连接互联网");}else {System.out.println("不能有线上网!");}}
}
电脑的使用者,只需要在连接网络时,通过适配器连上电脑的usb接口,再将网线插到适配器上,即可实现有线上网:
public class Client {public static void main(String[] args) {Computer computer = new Computer();computer.connectInternet(new Adapt(new Usb()));}
}
2.2、接口适配器
接口适配器,通常运用在某个具体的实现类,只想实现接口中部分方法的情况:
接口中有五个方法:
public interface Inter {void method1();void method2();void method3();void method4();void method5();}
但是某个实现类只想实现其中的部分方法,可以引入一个抽象类
作为中间层,实现所有的方法:
public abstract class AbsClass implements Inter{@Overridepublic void method1() {}@Overridepublic void method2() {}@Overridepublic void method3() {}@Overridepublic void method5() {}@Overridepublic void method4() {}
}
具体的实现类只需要继承
该抽象类
即可自由选择需要实现的方法:
public class BusinessClass extends AbsClass{@Overridepublic void method1() {System.out.println("只用到了method1");}
}
三、桥接模式
桥接模式是一种结构型设计模式
,引入桥接对象来解耦抽象部分和具体实现部分,使抽象部分与实现部分分离。
其主要角色有:
- 抽象类:定义了抽象的接口,并持有一个对实现类对象的引用。抽象类的实现通常依赖于实现类。
- 扩展抽象类:是抽象类的具体子类,提供了具体的功能实现。
- 实现类接口:定义了实现类的接口,通常是一个抽象类或者接口,提供了具体实现类的基本方法。
- 具体实现类:实现了实现类接口的具体类,负责实现具体的功能。
如果举一个生活中的案例,例如手机有不同的款式,比如翻盖式,折叠式,不同的式样又有不同的品牌。假设需要新增一个样式,那么需要在新的样式下加上所有的品牌。(反之也一样,在所有的品牌下都加上新样式)。
引入桥接模式解决这样的问题,则可以将品牌
设置为一个接口,并定义所有品牌
手机都具有的功能(开机,关机,打电话):
/*** 品牌* 所有品牌的手机都有开机关机,打电话的功能*/
public interface Brand {void open();void close();void call();
}
不同品牌的手机实现品牌接口,重写其中的方法:
public class VivoPhone implements Brand {@Overridepublic void open() {System.out.println("vivo 手机 开机");}@Overridepublic void close() {System.out.println("vivo 手机 关机");}@Overridepublic void call() {System.out.println("vivo 手机 打电话");}
}
public class XiaomiPhone implements Brand{@Overridepublic void open() {System.out.println("小米手机 开机");}@Overridepublic void close() {System.out.println("小米手机 关机");}@Overridepublic void call() {System.out.println("小米手机 打电话");}
}
将手机
设置为抽象类,组合了品牌
,同时引用了不同品牌共有的方法:
public abstract class Phone {private Brand brand;public Phone(Brand b) {this.brand = b;}public void open(){brand.open();}public void close(){brand.close();}public void call(){brand.call();}}
不同样式
的手机,只需要继承手机抽象类即可:
public class FoldedPhone extends Phone{public FoldedPhone(Brand b) {super(b);}@Overridepublic void open() {super.open();System.out.println("折叠式 手机开机");}@Overridepublic void close() {super.close();System.out.println("折叠式 手机关机");}@Overridepublic void call() {super.call();System.out.println("折叠式 手机打电话");}
}
创建一个折叠式的小米手机:
public class Client {public static void main(String[] args) {FoldedPhone foldedPhone = new FoldedPhone(new XiaomiPhone());foldedPhone.call();foldedPhone.open();foldedPhone.close();}
}
小米手机 打电话
折叠式 手机打电话
小米手机 开机
折叠式 手机开机
小米手机 关机
折叠式 手机关机
如果后续需要增加品牌
或者样式
,只需要实现品牌
接口,或者继承手机
抽象类即可。从这个案例不难看出,当一个系统有多个维度
需要变化时,桥接模式可以把这些维度分开,避免创建大量的子类和多重继承
相关文章:
设计模式の建造者适配器桥接模式
文章目录 前言一、建造者模式二、适配器模式2.1、对象适配器2.2、接口适配器 三、桥接模式 前言 本篇是关于设计模式中建造者模式、适配器模式(3种)、以及桥接模式的笔记。 一、建造者模式 建造者模式是属于创建型设计模式,通过一步步构建一个…...
.net framework手动升级到.net core注意点
因为项目原因,还使用着比较原始的 .NETFramework框架,但因为某种原因,暂时不让升级到.NET 6。为了能够解锁更多 VisualStudio2022的功能,尝试手动修改 csproj文件。 这个过程中,也会遇到不少坑,再次做个记…...
排队论、负载均衡和任务调度关系
目录 排队论、负载均衡和任务调度关系 一、排队论 二、负载均衡 三、任务调度 四、总结 排队论、负载均衡和任务调度关系 排队论为负载均衡和任务调度提供了数学理论和方法支持 排队论、负载均衡和任务调度是三个相关但不同的概念。以下是对这三个概念的详细解释和它们之…...
【C++图论】1042. 不邻接植花|1712
本文涉及知识点 C图论 LeetCode1042. 不邻接植花 有 n 个花园,按从 1 到 n 标记。另有数组 paths ,其中 paths[i] [xi, yi] 描述了花园 xi 到花园 yi 的双向路径。在每个花园中,你打算种下四种花之一。 另外,所有花园 最多 有…...
AI开源南京分享会回顾录
AI 开源南京分享会,已于2024年11月30日下午在国浩律师(南京)事务所5楼会议厅成功举办。此次活动由 KCC南京、PowerData、RISC-Verse 联合主办,国浩律师(南京)事务所协办。 活动以“开源视角的 AI 对话”为主…...
Java版-图论-最短路-Floyd算法
实现描述 网络延迟时间示例 根据上面提示,可以计算出,最大有100个点,最大耗时为100*wi,即最大的耗时为10000,任何耗时计算出来超过这个值可以理解为不可达了;从而得出实现代码里面的: int maxTime 10005…...
ChatGPT大模型 创作高质量文案的使用教程和案例
引言 随着人工智能技术的飞速发展,大语言模型如 ChatGPT 在创作文案、生成内容方面展现出了强大的能力。无论是个人用户还是企业用户,都可以利用 ChatGPT 提高工作效率、激发创意、甚至解决实际问题。本文将详细介绍 ChatGPT 如何帮助创作各类高质量文案,并通过具体案例展示…...
SQL注入及解决
SQL注入是一种常见的网络攻击方式,攻击者通过在输入字段中插入恶意的SQL代码,诱使应用程序执行攻击者构造的SQL语句,从而达到非法获取数据、篡改数据或执行恶意操作的目的。 以下是SQL注入的主要原理总结: 1. 核心原理 SQL注入…...
uni-app多环境配置动态修改
前言 这篇文章主要介绍uniapp在Hbuilderx 中,通过工程化,区分不同环境、动态修改小程序appid以及自定义条件编译,解决代码发布和运行时手动切换问题。 背景 当我们使用uniapp开发同一个项目发布不同的环境二级路径不同时,这时候…...
EasyPlayer.js播放器如何在iOS上实现低延时直播?
随着流媒体技术的迅速发展,H5流媒体播放器已成为现代网络视频播放的重要工具。其中,EasyPlayer.js播放器作为一款功能强大的H5播放器,凭借其全面的协议支持、多种解码方式以及跨平台兼容性,赢得了广泛的关注和应用。 那么要在iOS上…...
mHand Pro动捕数据手套在人形机器人领域的具体运用
mHandPro是一款高精度的动作捕捉数据手套,可应用于动作捕捉与VR交互等领域,配套”mHand Studio“引擎,可实时捕捉真人手部位姿及运动轨迹数据,将数据导出还可以用于人形机器人的训练加速高精度机器人操作技能的培训进程。 高精度动…...
【css常用动画总结01】
一、效果如下: 屏幕录制2024-11-27 17.28.30 二、css常用动画代码: .flex-box{position: relative; } .animation-all {display: flex;p{margin:0;font-size: 12px;}.animate-test1 {width: 102.4px;height: 102.4px;background: url(../assets/images/…...
从入门到精通:系统化棋牌游戏开发全流程教程
棋牌游戏开发需要丰富的技术知识和全面的规划,从开发环境搭建到实际功能实现,步骤清晰且逻辑严谨。以下是完整教程,涵盖了每个关键环节,并提供相关软件的具体下载地址,助力开发者高效完成棋牌游戏项目。 一、开发环境准…...
MyBatis 框架学习与实践
引言 MyBatis 是一个流行的 Java 持久层框架,它提供了简单的方法来处理数据库中的数据。本文将结合笔记和图片内容,详细讲解 MyBatis 的使用,包括配置、注解、优化技巧以及如何处理特殊字符和参数。 1. MyBatis 基础 1.1 引入依赖 首先&a…...
数据可视化的Python实现
一、GDELT介绍 GDELT ( www.gdeltproject.org ) 每时每刻监控着每个国家的几乎每个角落的 100 多种语言的新闻媒体 -- 印刷的、广播的和web 形式的,识别人员、位置、组织、数量、主题、数据源、情绪、报价、图片和每秒都在推动全球社会的事件,GDELT 为全…...
微信小程序实现联动删除输入验证码框
以下是json代码 {"component": true,"usingComponents": {} }以下是wxml代码 <van-popup show"{{ show }}" bind:close"onClose" custom-class"extract"><image src"../../images/extract/icon1.png"…...
C语言程序设计P6-1【应用指针进行程序设计 | 第一节】——知识要点:指针的概念、定义和运算、指针变量作函数的参数
知识要点:指针的概念、定义和运算、指针变量作函数的参数 视频: 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 输入两个整数,按大小顺序输出,要求用函数处理,而且用指针类型的数据作函数参数…...
C++编程: 基于cpp-httplib和nlohmann/json实现简单的HTTP Server
文章目录 0. 引言1. 完整实例代码2. 关键实现3. 运行与测试 0. 引言 本文基于 cpp-httplib 和 nlohmann/json 实现简单的 HTTPS Server 实例代码,这两个库均是head-only的。 1. 完整实例代码 如下实例程序修改自example/server.cc #include <httplib.h>#i…...
多模态大模型(二)——用Transformer Encoder和Decoder的方法(BLIP、CoCa、BEiTv3)
文章目录 BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation 理解、生成我都要,一个很有效的、根据图片生成caption的工具1. BLIP的研究动机2. BLIP的模型结构3. CapFilt Model4. BLIP的训练过程 CoCa: C…...
SpringBoot快速入门
SpringBoot 文章目录 SpringBoot1. Spring Boot 概念2. Spring 使用痛点3. Spring Boot功能4. 快速搭建5. 起步依赖原理6. SpringBoot 配置6.1 配置文件6.2 YAML介绍6.3 YAML语法6.4 YAML数据6.5 YAML参数引用 7.配置数据读取7.1 Value("${}")7.2 Environment7.3 Con…...
Qt编写区位码gb2312、机内码、国标码————附带详细介绍和编码实现
文章目录 0 背景1 了解编码1.1 ASCII码1.2 机内码、国标码、区位码1.2.1 区位码1.2.2 国标码(GB 2312-80)1.2.3 汉字机内码(GB 2312) 1.3 GBK和GB2312的区别2 编码实现2.1 QString数据转QByteArray类型2.1.1 使用QTextCodec2.1.2 …...
IDEA 未启用lombok插件的Bug
项目中maven已引用了lombok依赖,之前运行没有问题的,但有时启动会提示: java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled. Your processor is: com.sun.proxy.$Proxy8 Lombok support…...
R语言学习笔记-1
1. 基础操作和函数 清空环境:rm(list ls()) 用于清空当前的R环境。 打印输出:print("Hello, world") 用于输出文本到控制台。 查看已安装包和加载包: search():查看当前加载的包。install.packages("package_na…...
NFT的公链及开放联盟链信息整理
BSN链 名称内容类型开放联盟链网址https://www.bsnbase.com/节点信息登陆后可免费获取区块链浏览器可查看交易详情使用案例光明艺品、数藏中国、千寻数藏、集集文创、乾坤数藏 至信链 名称内容类型开放联盟链网址https://zxchain.qq.com/节点信息需要登录并充值后获取区块链…...
android notification
前言 在做应用时,时常需要在通知栏显示一条通知,那么具体流程是怎样的呢,怀着这样的探究目的,来进行一步步源码分析。 源码梳理 package com.android.server; ... public final class SystemServer implements Dumpable {...pr…...
C# 多态性
文章目录 前言一、多态性的定义二、C# 中的多态性实现方式1. 方法重写(Overriding)2. 方法重载(Overloading)3. 接口实现(Interface implementation) 三、多态性的优点1. 提高代码的可维护性2. 增强代码的可…...
类与对象以及ES6的继承
认识class定义类 类的声明用的比较多 类与构造函数的异同 类的构造函数 类的实例方法 类的访问器方法 在类里面写拦截方法 类的静态方法 通过类名直接访问 es6类的继承-extends super关键字 子类可以重写父类方法包括父类的静态方法也可以继承父类的静态方法 babel可以将新的代…...
每日一站技術架構解析之-cc手機桌布網
# 網站技術架構解析: ## 一、整體架構概述https://tw.ccwallpaper.com是一個提供手機壁紙、桌布免費下載的網站,其技術架構設計旨在實現高效的圖片資源管理與用戶訪問體驗優化。 ### (一)前端展示 1. **HTML/CSS/JavaScript基礎構…...
【橘子容器】如何构建一个docker镜像
你肯定打过docker镜像是吧,作为一个开发这很正常,那么你用的什么打包方式呢,这里我们来梳理几种常用的docker镜像构建方式。 ps:这里不是太讲原理,更多的是一种科普和操作。因为讲原理的东西网上已经够多了。 一、Dock…...
【漏洞复现】CVE-2024-34102 Magento Open Source XXE漏洞
目录 漏洞介绍 影响版本 环境搭建 查看版本 漏洞复现 手动复现 漏洞 poc Magento Open Source 是一个免费开源的电子商务平台,适合中小企业或开发团队通过自定义代码和插件创建在线商店。它由社区开发和支持,功能强大但需要更多的技术投入。Adobe…...
数据结构 ——二叉树转广义表
数据结构 ——二叉树转广义表 1、树转广义表 如下一棵树,转换为广义表 root(c(a()(b()()))(e(d()())(f()(j(h()())())))) (根(左子树)(右子树)) 代码实现 #include<stdio.h> #include<stdlib.h>//保存…...
Redis篇-6--原理篇5--单线程模型
1、概述 Redis 采用单线程模型来处理客户端请求,这意味着在任意时刻只有一个命令被执行。这种设计简化了 Redis 的实现,并确保了高并发环境下的数据一致性。尽管 Redis 是单线程的,但它通过高效的内存管理和网络 I/O 操作,仍然能…...
LSTM详解
1. LSTM设计 LSTM(长短期记忆网络)详解 长短期记忆网络(LSTM, Long Short-Term Memory) 是一种特殊的循环神经网络(RNN),特别适合处理和预测序列数据中的长时间依赖关系。LSTM 通过引入“门机制”(如输入门、遗忘门、输出门)来解决标准 RNN 在长时间序列任务中梯度消…...
Docker 安装 Seata2.0.0 (快速配置)
说明:已安装Docker、MySql等,案例使用Mysql数据库模式、Nacos配置信息 1、准备工作 1.1 拉取镜像 [rootTseng ~]# docker pull seataio/seata-server:2.0.0 2.0.0: Pulling from seataio/seata-server 001c52e26ad5: Already exists d9d4b9b6e964: P…...
文件断点续传(视频播放,大文件下载)
客户端每次请求取大文件部分数据。 浏览器播放mp4视频时,会首先传Range消息头,检测到206状态码,和Content-Range,Accept-Ranges 会自动请求余下数据。后端需要在文件任意偏移量取数据。 参考: springboot项目实现断…...
神经网络基础-初识神经网络
人工神经网络( Artificial Neural Network, 简写为ANN)也简称为神经网络(NN),是一种模仿生物神经网络结构和功能的计算模型。人脑可以看做是一个生物神经网络,由众多的神经元连接而成。各个神经…...
爬虫获取的数据能否用于商业分析?
根据搜索结果,爬虫获取的数据能否用于商业分析,主要取决于以下几个因素: 数据的合法性与合规性: 爬虫技术本身并不违法,关键在于使用的方式和目的。爬虫技术的使用必须遵守相关法律法规,如《反不正当竞争法…...
【Java】3、并发编程 JUC(模块三:设计模式)
目录 Immutability模式Copy-on-Write模式线程本地存储模式Guarded Suspension模式(保护性暂停)Balking模式Thread-Per-Message模式Worker Thread模式两阶段终止模式生产者-消费者模式 Immutability模式 Copy-on-Write模式 线程本地存储模式 Guarded S…...
ASP.NET|日常开发中连接Sqlite数据库详解
ASP.NET|日常开发中连接Sqlite数据库详解 前言一、安装和引用相关库1.1 安装 SQLite 驱动1.2 引用命名空间 二、配置连接字符串2.1 连接字符串的基本格式 三、建立数据库连接3.1 创建连接对象并打开连接 四、执行数据库操作4.1 创建表(以简单的用户表为例…...
渗透测试学习笔记(四)web漏洞
一.web相关漏洞 漏洞分类漏洞类型Web 源码类漏洞SQL 注入,文件上传,XSS,代码执行,变量覆盖,逻辑漏洞,反序列化Web 中间件漏洞未授权访问,变量覆盖数据库漏洞弱口令,权限提升系统层漏…...
Facebook如何避免因IP变动而封号?实用指南
随着Facebook在个人社交与商业推广中的广泛应用,越来越多的用户面临因“IP变动”而被封号的问题。尤其是跨境电商、广告运营者和多账号管理用户,这种情况可能严重影响正常使用和业务发展。那么,如何避免因IP变动导致的封号问题?本…...
【Vulkan入门】10-CreatePipeline
目录 先叨叨Git信息关键代码TestPipeline::Initialize() 编译运行 先叨叨 到上篇为止已经创建了FrameBuffer和RenderPass。建立Pipeline的先决条件已经具备。本篇就来创建Pipeline。 Git信息 repository: https://gitee.com/J8_series/easy-car-uitag: 10-CreatePipelineurl…...
视频安防监控平台:Liveweb视频监控管理云平台方案
LiveWeb是深圳市好游科技有限公司开发的一套综合视频汇聚管理平台,可提供多协议(RTSP/RTMP/GB28181/海康Ehome/大华,海康SDK等)的视频设备接入,支持GB/T28181上下级联,RTSP\RTMP转GB/T28181,云台…...
企业级日志分析系统ELK之ELK概述
ELK 概述 ELK 介绍 什么是 ELK 早期IT架构中的系统和应用的日志分散在不同的主机和文件,如果应用出现问题,开发和运维人员想排 查原因,就要先找到相应的主机上的日志文件再进行查找和分析,所以非常不方便,而且还涉及…...
scala隐式转换
概念: 在Scala编程语言中,隐式转换是一种强大的功能,它允许程序在需要时自动转换数据类型或增强对象功能。这种转换通常是通过定义一个标记为implicit的函数来实现的,这个函数能够将一种类型转换为另一种类型。隐式转换的使用可以…...
基于无线传感器网络的无线土壤湿度采集系统(附详细使用教程+完整代码+原理图+完整课设报告)
🎊项目专栏:【Zigbee课程设计系列文章】(附详细使用教程完整代码原理图完整课设报告) 前言 👑由于无线传感器网络(也即是Zigbee)作为🌐物联网工程的一门必修专业课,具有…...
367_C++_计算mouse移动过程中,视频框的右侧、底部边距,以及根据实时的右侧、底部边距计算—视频框的左上角位置
代码分析 1. restorePos 方法 restorePos 的作用是恢复 NavigationFrame 的位置,将其移动到父窗口或者指定矩形内的特定位置。 void NavigationFrame::restorePos() {// 获取目标矩形:优先使用 `m_pRect`,否则默认使用视频区域或父窗口区域RSRect videoRect(m_pVide...
Ubuntu下将Julia嵌入Jupyter内核
一.安装 Julia 如果 Julia 尚未安装: 打开终端,下载最新的 Julia 安装包: wget https://julialang-s3.julialang.org/bin/linux/x64/1.9/julia-1.9.3-linux-x86_64.tar.gz 解压并移动到 /opt: tar -xvzf julia-1.9.3-linux-x86_…...
babeltrace与CTF相关学习笔记-1
babeltrace与CTF相关学习笔记-1 写在前面代码下载代码代码编译相关的依赖bootstrapconfigure过程编译和安装注 编译完成后,初步的审视找到与ctf相关的工程tests./test-ctf-writer.sh先运行./test-ctf-writer.shctf-writer脚本 vscode跟踪ctf-writer.c后记࿱…...
国内Chrome浏览器下载安装教程,谷歌浏览器最新下载教程
今天主要讲解的是国内Chrome浏览器下载安装教程,谷歌浏览器最新下载教程,包括确认浏览器版本、ChromeDriver 驱动的下载,同理,这个教程同样适用于windows版本的,linux 版本的, mac 版本的。 众所周知&…...