C++设计模式-桥梁模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
一、桥梁模式基本介绍
桥梁模式(Bridge Pattern)是一种结构型设计模式,又叫桥接模式,其核心思想是将抽象部分与实现部分分离,使它们可以独立变化。这种模式通过组合代替继承,有效解决了多层继承导致的类爆炸问题。例如:当开关需要控制不同类型的灯泡时,若采用继承会导致代码难以扩展,而桥梁模式通过抽象开关行为与灯泡实现解耦,让两者进行独立演化。
1.1 模式诞生背景
在传统继承体系中,若一个类存在多个变化维度(如我们常做的窗口的形状+颜色+位置等等),会导致类数量呈乘法增长(如圆形红色、方形蓝色等)。桥梁模式通过分层抽象,将N*M的组合转换为N+M的结构。
二、内部原理与结构解析
2.1 角色职责与协作机制
桥梁模式的核心在于分层抽象与组合代替继承。
- 其角色分工如下:
Abstraction(抽象层):定义高层业务逻辑接口,持有对实现层接口Implementor的引用。例如,UI框架中的控件基类(如Button)。
RefinedAbstraction(扩展抽象层):对抽象层进行功能扩展。例如,支持不同交互方式的按钮(如触摸按钮TouchButton或物理按钮PhysicalButton)。
Implementor(实现层接口):定义底层操作的抽象接口。例如,图形渲染接口(如RenderAPI)。
ConcreteImplementor(具体实现层):实现具体平台或场景的逻辑。例如,OpenGL渲染器OpenGLRenderer或Vulkan渲染器VulkanRenderer。 - 其协作流程如下:
(1).客户端创建具体实现对象(如MySQLDriver)并传递给抽象层(如DatabaseClient)。
(2).抽象层通过组合调用实现层接口完成功能(如执行SQL查询)。
(3).新增平台或功能时,只需扩展实现层,无需修改抽象层代码。
2.2 实现原理与关键代码
核心代码结构:
// 实现层接口:数据库驱动
class DBDriver {
public:virtual void connect() = 0;virtual void executeQuery(string sql) = 0;
};// 具体实现:MySQL驱动
class MySQLDriver : public DBDriver {
public:void connect() override { /* MySQL连接逻辑 */ }void executeQuery(string sql) override { /* 执行查询 */ }
};// 抽象层:数据库客户端
class DatabaseClient {
protected:DBDriver* driver; // 核心:持有实现层对象
public:DatabaseClient(DBDriver* d) : driver(d) {}virtual void runQuery(string sql) {driver->connect();driver->executeQuery(sql);}
};// 扩展抽象层:支持事务的客户端
class TransactionalClient : public DatabaseClient {
public:using DatabaseClient::DatabaseClient;void beginTransaction() { /* 事务开启逻辑 */ }void commit() { /* 提交事务 */ }
};
关键点:
- 抽象层通过指针持有实现层对象,实现运行时绑定(如动态切换数据库驱动)。
- 抽象层与实现层可独立扩展,例如新增PostgreSQLDriver无需修改DatabaseClient。
2.3 设计原则与模式对比
遵循原则:
- 单一职责原则(抽象层管业务,实现层管平台)。
- 开闭原则(新增功能通过扩展而非修改)。
与策略模式区别:
- 策略模式:同一行为的算法替换(如排序算法)。
- 桥梁模式:两个维度的结构分离(如控件类型+渲染引擎)。
三、典型应用场景
3.1 多维度变化系统
跨平台UI开发:抽象控件(按钮/输入框)与具体平台实现(Windows/macOS)分离:
抽象层:定义控件行为(如Window::draw())。
实现层:不同平台的渲染实现(如Win32Renderer或CocoaRenderer)。
优势:一套控件逻辑适配多平台,比如新增Linux支持的话,只需实现LinuxRenderer;
数据库驱动:统一SQL接口与不同数据库(MySQL/Oracle)实现解耦:
抽象层:统一SQL接口(如execute(“SELECT * FROM table”))。
实现层:不同数据库协议解析(如MySQL协议解析器MySQLProtocol、PostgreSQL解析器PgProtocol)。
消息系统:消息类型(文本/图片)与传输协议(TCP/UDP)独立扩展:
抽象层:消息发布/订阅接口(如publish(topic, message))。
实现层:传输协议实现(如KafkaProtocol、RabbitMQProtocol),支持协议的热切换。
3.2 需要动态切换实现
日志系统:日志级别(DEBUG/ERROR)与输出目标(文件/网络)组合:
抽象层:日志级别管理(如Logger::log(level, message))。
实现层:输出目标(如FileLogger写入文件、NetworkLogger发送到服务器),可动态配置输出方式。
支付网关:支付方式(信用卡/支付宝/微信)与风控策略(基础/高级)进行解耦;
抽象层:支付流程。
实现层:支付渠道(如阿里的AlipayImpl、微信的WeChatPayImpl),支持商户按需切换支付方。
四、使用方法与实现步骤
4.1 核心步骤拆解
桥梁模式的实现可分为6个关键步骤,以跨平台UI按钮开发为例进行说明:
步骤1:识别独立变化维度
目标:确定系统中存在两个以上独立变化的维度。
案例:UI控件类型(按钮/输入框)。
- 平台渲染实现(Windows/macOS);
- 验证标准:每个维度都能独立扩展而不影响其他维度;
步骤2:定义实现层接口(Implementor)
作用:抽象底层具体操作的通用接口。
代码示例:
// 平台渲染接口(实现层)
class RenderAPI {
public:virtual void drawButton(int x, int y) = 0;virtual void drawTextBox(int width) = 0;
};
步骤3:实现具体实现类(ConcreteImplementor)
原则:每个具体实现对应一个独立变化维度。
代码示例
// Windows渲染实现
class Win32Renderer : public RenderAPI {
public:void drawButton(int x, int y) override {// 调用Windows API绘制按钮 cout << "Win32按钮绘制于(" << x << "," << y << ")" << endl;}// 其他方法实现...
};// macOS渲染实现
class CocoaRenderer : public RenderAPI {
public:void drawButton(int x, int y) override {// 调用Cocoa框架绘制按钮 cout << "Cocoa按钮绘制于(" << x << "," << y << ")" << endl;}
};
步骤4:定义抽象层基类(Abstraction)
关键点:通过组合持有实现层对象。
代码示例:
// UI控件抽象基类(抽象层)
class UIControl {
protected:RenderAPI* renderer; // 核心:组合实现层对象
public:UIControl(RenderAPI* r) : renderer(r) {}virtual void render() = 0;
};
步骤5:扩展具体抽象类(RefinedAbstraction)
作用:添加业务逻辑,调用实现层接口。
代码示例:
// 具体按钮控件
class Button : public UIControl {int x, y;
public:Button(RenderAPI* r, int x, int y) : UIControl(r), x(x), y(y) {}void render() override {renderer->drawButton(x, y);// 可添加按钮特有逻辑 }
};
步骤6:客户端组合使用
动态绑定示例:
int main() {// 创建Windows渲染器 RenderAPI* winRenderer = new Win32Renderer();// 创建按钮并绑定渲染器 Button winButton(winRenderer, 100, 200);winButton.render(); // 输出:Win32按钮绘制于(100,200)// 切换为macOS渲染器 RenderAPI* macRenderer = new CocoaRenderer();Button macButton(macRenderer, 150, 300);macButton.render(); // 输出:Cocoa按钮绘制于(150,300)
}
4.2 实现细节与技巧
- 对象生命周期管理
智能指针优化:使用std::unique_ptr避免内存泄漏。
class UIControl {std::unique_ptr<RenderAPI> renderer; // 自动管理资源
public:UIControl(std::unique_ptr<RenderAPI> r) : renderer(std::move(r)) {}
};
- 接口设计原则
最小接口暴露:实现层接口仅声明必要方法,避免过度设计;
正交性设计:确保抽象层与实现层接口无重叠功能; - 扩展性实践
动态切换实现:运行时更换实现层对象。
void switchPlatform(Button& btn, RenderAPI* newRenderer) {btn.setRenderer(newRenderer); // 需在抽象层添加setter方法
}
五、常见问题与解决方案
5.1 典型误区
问题类型 | 错误表现 | 解决方案 |
---|---|---|
过度设计 | 简单场景强行使用桥接 | 评估变化可能性,仅在实际存在多维变化时使用 |
角色混淆 | 抽象层包含实现细节 | 严格遵循SRP原则,抽象层仅定义高层逻辑 |
循环依赖 | Abstraction与Implementor相互引用 | 引入中介者模式或重构依赖方向 |
5.2 性能优化
对象池技术:对频繁创建的Implementor对象进行复用;
缓存机制:对稳定不变的Implementor实例进行缓存;
懒加载:延迟初始化高消耗的Implementor对象;
5.3 与其他模式的关系
- 适配器模式:均涉及接口转换,但适配器解决接口不兼容,桥接侧重解耦抽象与实现;
- 策略模式:都通过组合替换行为,但策略模式侧重算法替换,桥接模式处理结构分离;
- 抽象工厂:常与桥接模式配合,用于创建Implementor对象;
六、总结说明
6.1 模式优势
- 将抽象与实现进行解耦:提升系统扩展性(符合OCP原则);
- 减少子类数量:N+M代替N*M的类结构;
- 运行时绑定:实现动态切换会更灵活;
6.2 适用性评估
推荐使用场景:
- 需要多平台支持的系统;
- 存在多个独立变化维度;
- 需要避免永久性绑定实现;
不适用场景:
- 功能稳定的简单系统;
- 变化维度单一的组件;
6.3 未来应用
随着C++20引入Concepts等新特性,桥梁模式可结合模板元编程实现更类型安全的抽象。在跨平台框架、微服务架构中,该模式将继续发挥关键作用。
相关文章:
C++设计模式-桥梁模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
一、桥梁模式基本介绍 桥梁模式(Bridge Pattern)是一种结构型设计模式,又叫桥接模式,其核心思想是将抽象部分与实现部分分离,使它们可以独立变化。这种模式通过组合代替继承,有效解决了多层继承导致的类爆…...
系统转换、系统维护、净室软件工程、构件软件工程(高软51)
系列文章目录 系统转换、系统维护、净室软件工程、构件软件工程 文章目录 系列文章目录前言一、系统转换二、系统维护三、净室软件工程四、基于构件的软件工程总结 前言 本节讲明遗留系统的系统转换、系统维护、净室软件工程、基于构件软件工程相关知识。 一、系统转换 就是讲…...
自然语言处理(13:RNN的实现)
系列文章目录 第一章 1:同义词词典和基于计数方法语料库预处理 第一章 2:基于计数方法的分布式表示和假设,共现矩阵,向量相似度 第一章 3:基于计数方法的改进以及总结 第二章 1:word2vec 第二章 2:word2vec和CBOW模型的初步实现 第二章 3:CBOW模型…...
Docker镜像迁移方案
Docker镜像迁移方案 文章目录 Docker镜像迁移方案一:背景二:操作方式三:异常原因参考: 一:背景 比如机器上已经有先有的容器,但是docker pull的时候是失败的二:操作方式 1、停止正在运行的容器…...
深度学习框架PyTorch——从入门到精通(10)PyTorch张量简介
这部分是 PyTorch介绍——YouTube系列的内容,每一节都对应一个youtube视频。(可能跟之前的有一定的重复) 创建张量随机张量和种子张量形状张量数据类型 使用PyTorch张量进行数学与逻辑运算简单介绍——张量广播关于张量更多的数学操作原地修改…...
Springboot 集成 Flowable 6.8.0
1. 创建 Spring Boot 项目 通过 Spring Initializr(https://start.spring.io/ )创建一个基础的 Spring Boot 项目,添加以下依赖: Spring WebSpring Data JPAMySQL DriverLombok(可选,用于简化代码&#x…...
Vue3 项目通过 docxtemplater 插件动态渲染 .docx 文档(带图片)预览,并导出
Vue3 项目通过 docxtemplater 插件动态渲染 .docx 文档(带图片)预览,并导出 预览安装插件示例代码项目目录结构截图实际效果截图 动态渲染 .docx 文档(带图片),预览、导出安装插件docx 模板文件内容完整代码…...
实验一、Linux环境下实现进度条小程序:深入解析核心实现与关键技术细节
目录 引言:为什么需要进度条?环境准备与项目结构分析原理剖析:从终端输出到动态刷新代码逐行解析(附完整代码) 4.1 头文件与宏定义4.2 进度条的动态构建逻辑4.3 关键转义字符:\r与\n的深度对比4.4 缓冲机制…...
生活电子常识——cmd不能使用anaconda的python环境,导致输入python打开应用商店
前言 电脑已经安装了anaconda,从自带的Anaconda Prompt (Anaconda3)中是可以识别python环境的,然而切换到cmd时,突然发现cmd中无法识别anaconda的python环境,竟然打开了应用商店让我安装Python,这当然是不对的。 解决 这是因为…...
TypeScript中的声明合并:与JavaScript的对比与实践指南
引言 在大型项目开发中,代码的可维护性和可扩展性至关重要。TypeScript作为JavaScript的超集,通过静态类型系统带来了更强大的代码组织能力。其中声明合并(Declaration Merging) 是TypeScript独有的重要特性,本文将深…...
数据结构初阶-二叉树链式
目录 1.概念与结构 2.二叉数链式的实现 2.1遍历规则 2.2申请内存空间 2.3手动构建一棵二叉树 2.4二叉树结点的个数 2.5二叉树叶子结点的个数 2.6二叉树第K层结点个数 2.7二叉树的高度 2.8二叉树中查找值为x的结点 2.9二叉树的销毁 3.层序遍历 3.1概念 3.2层序遍历…...
2024年认证杯SPSSPRO杯数学建模B题(第二阶段)神经外科手术的定位与导航全过程文档及程序
2024年认证杯SPSSPRO杯数学建模 B题 神经外科手术的定位与导航 原题再现: 人的大脑结构非常复杂,内部交织密布着神经和血管,所以在大脑内做手术具有非常高的精细和复杂程度。例如神经外科的肿瘤切除手术或血肿清除手术,通常需要…...
Linux程序性能分析
为什么程序会慢? 在深入工具和方法之前,我们先来聊聊为什么程序会慢。一个程序主要在三个方面消耗资源: CPU时间 - 计算太多、算法效率低 内存使用 - 内存泄漏、频繁申请释放内存 I/O操作 - 文件读写、网络通信太频繁 今天我们主要聚焦C…...
【开题报告+论文+源码】基于SpringBoot的智能安全与急救知识科普系统设计与实现
项目背景与意义 在全球范围内,安全与急救知识的普及已成为提升公众安全素养、减少意外伤害发生率、提高突发事件应对能力的重要举措。尤其是在当今社会,人们面临的生活、工作环境日益复杂,交通事故、火灾、溺水、突发疾病等各种意外事件的发生…...
Linux shift 命令使用详解
简介 在 Bash 脚本中,shift 命令用于将命令行参数向左移动,有效地丢弃第一个参数并将其他参数向下移动。 基础语法 shift [N]N(可选)→ 要移动的位置数。默认值为 1 示例用法 移动参数 #!/bin/bash echo "Before shift…...
【C++网络编程】第5篇:UDP与广播通信
一、UDP协议核心特性 1. UDP vs TCP 特性 UDPTCP连接方式无连接面向连接(三次握手)可靠性不保证数据到达或顺序可靠传输(超时重传、顺序控制)传输效率低延迟,高吞吐相对较低(因握手和确认机制&…...
C++11QT复习 (五)
文章目录 **Day6-2 成员访问运算符重载(2025.03.25)****1. 复习****2. 成员访问运算符重载****2.1 箭头运算符 (->) 重载****(1) 语法** **2.2 解引用运算符 (*) 重载****(1) 语法** **3. 代码分析****3.1 代码结构****3.2 代码解析****(1) Data 类**…...
Python项目-基于Python的网络爬虫与数据可视化系统
1. 项目简介 在当今数据驱动的时代,网络爬虫和数据可视化已成为获取、分析和展示信息的重要工具。本文将详细介绍如何使用Python构建一个完整的网络爬虫与数据可视化系统,该系统能够自动从互联网收集数据,进行处理分析,并通过直观…...
SpringCloud Zuul 使用教程
SpringCloud Zuul 使用教程 目录 Zuul 简介环境准备搭建 Zuul 网关 • 3.1 Maven 依赖 • 3.2 配置文件 • 3.3 启动类注解基本路由配置 • 4.1 简单路由 • 4.2 基于路径的路由 • 4.3 基于服务的路由Zuul 高级配置 • 5.1 过滤器配置 • 5.2 限流与熔断 • 5.3 负载均衡 •…...
介绍一款基于MinerU的PDF翻译工具
一。简介 Fast pdf translate是一款pdf翻译软件,基于MinerU实现pdf转markdown的功能,接着对markdown进行分割, 送给大模型翻译,最后组装翻译结果并由pypandoc生成结果pdf。 git地址: https://github.com/kv1830/fast…...
轻量级TLS反向代理工具TLS-reverse-proxy:打造安全通信桥梁
在数字化浪潮席卷全球的今天,数据隐私与传输安全已成为企业及个人的核心关切。TLS(传输层安全协议)作为互联网通信的"隐形卫士",承担着保护数据在传输过程中不被窃取或篡改的重要使命。然而,对于许多传统服务…...
SQL问题分析与诊断(8)——前提
8.1. 前提 与其他关系库类似,SQL Server中,当我们对存在性能问题的SQL语句进行分析和诊断时,除了获取该SQL语句本身外,还需要获取SQL语句相应的查询计划及其相关的数据环境。这里,所谓数据环境,具体是指SQ…...
关于cmd中出现无法识别某某指令的问题
今天来解决以下这个比较常见的问题,安装各种软件都可能会发生,一般是安装时没勾选注册环境变量,导致cmd无法识别该指令。例如mysql,git等,一般初学者可能不太清楚。 解决这类问题最主要的是了解环境变量的概念&#x…...
如何处理不同输入类型(例如邮箱、电话号码)的验证?
处理不同输入类型(如邮箱、电话号码)的验证可以通过多种方法实现,包括使用 HTML5 内置验证、JavaScript/jQuery 自定义验证和正则表达式。以下是一些常用的验证方法和示例。 1. 使用 HTML5 内置验证 HTML5 提供了一些内置的输入类型,可以自动处理基本的验证。 示例 <…...
Redis集群哨兵相关面试题
目录 1.Redis 主从复制的实现原理是什么? 详解 补充增量同步 replication buffer repl backlog buffer 2.Redis 主从复制的常见拓扑结构有哪些? 3.Redis 复制延迟的常见原因有哪些? 4.Redis 的哨兵机制是什么? 主观下线和客观下线 哨兵leader如何选出来的&#x…...
【CXX-Qt】4.1 extern “RustQt“
QObjects Properties Methods Signals #[cxx_qt::bridge] mod ffi {extern "RustQt" {} }extern “RustQt” 部分是 CXX-Qt 桥接的核心,用于声明 Rust 类型和签名,使其可用于 Qt 和 C。 CXX-Qt 代码生成器使用你的 extern “RustQt” 部…...
当 0 编程基础,用 ChatGPT 和 Cursor 开发同一应用时… |AI 开发初体验
求人不如求己。 事情是这样的,前段时间,我看了本书,书里介绍了款应用,能计算财富自由价格,还能制定退休计划。 结果,我迫不及待去下载这个应用时,发现这应用功能残缺,完全不可用。 …...
如何排查C++程序的CPU占用过高的问题
文章目录 可能的原因程序设计的BUG系统资源问题恶意软件硬件问题 通常步骤一个简单的问题代码在windows平台上如何排查Windows Process ExplorerWinDBG 在Linux平台如何排查使用TOP GDBPerf 可能的原因 程序设计的BUG 有死循环低效算法与数据结构滥用自旋锁频繁的系统调用&a…...
数据库练习
完善t_hero表 -- 添加作者字段 alter table t_hero add author varchar(100);-- 更新数据update t_hero set author "曹雪芹" where id 1; update t_hero set author "曹雪芹" where id 2; update t_hero set author "曹雪芹" where id…...
nodejs-原型污染链
还是老规矩,边写边学,先分享两篇文章 深入理解 JavaScript Prototype 污染攻击 | 离别歌 《JavaScript百炼成仙》 全书知识点整理-CSDN博客 Ctfshow web入门 nodejs篇 web334-web344_web334 ctfshow-CSDN博客 334-js审计 var express require(expr…...
无人机与AI技术结合的突破性应用场景
1. 自主导航与动态避障 技术栈:SLAM 强化学习 (PPO算法) 代码示例(Python PyTorch): import torch class DronePPO(torch.nn.Module):def __init__(self):super().__init__()self.actor torch.nn.Sequential(torch.nn.Linear…...
jsBridge在vue中使用
创建jsBridge.js /* eslint-disable */ function connectWebViewJavascriptBridge (callback) {if (window.WebViewJavascriptBridge) {callback(window.WebViewJavascriptBridge)} else {document.addEventListener(WebViewJavascriptBridgeReady, function () { callback(wi…...
Windows下docker使用教程
docker安装 镜像制作镜像加载容器创建更新镜像导出镜像 Windows10安装dockerdocker image制作docker 镜像加载docker 容器创建更新imageimage 导出为.tar文件 #以Windows10 、11为例 linux和Windows区别在于docker安装的程序是哪个操作系统的,后面的内容其实不变 …...
iOS:GCD信号量、同步、异步的使用方法
信号量的详细用法,可以用此方法进行队列管理 -(void)dispatchSignal{//crate的value表示,最多几个资源可访问dispatch_semaphore_t semaphore dispatch_semaphore_create(3);dispatch_queue_t quene dispatch_get_global_queue(DISPATCH_QUEUE_PRIORI…...
Nginx相关漏洞解析
一、CRLF注入漏洞 原理:Nginx将传入的url进行解码,对其中的%0a%0d替换成换行符,导致后面的数据注入至头部,造成CRLF 注入漏洞 1、开环境 2、访问网站,并抓包 3、构造请求头 %0ASet-cookie:JSPSESSID%3D1 这样就可以…...
SpringCloud构建一个服务步骤
Spring Cloud是一个用于构建分布式系统的开源框架,可以帮助开发者快速构建各种云原生应用。下面是一个简单的步骤,展示如何使用Spring Cloud构建一个服务: 创建一个Spring Boot项目:首先需要创建一个Spring Boot项目作为基础。可以…...
MySQL中怎么分析性能?
MySQL中主要有4种方式可以分析数据库性能,分别是慢查询日志,profile,Com_xxx和explain。 慢查询日志 先用下面命令查询慢查询日志是否开启, show variables like slow_query_log;# 一般默认都是以下结果 ---------------------…...
MinGW与使用VScode写C语言适配
压缩包 通过网盘分享的文件:MinGW.zip 链接: https://pan.baidu.com/s/1QB-Zkuk2lCIZuVSHc-5T6A 提取码: 2c2q 需要下载的插件 1.翻译 找到VScode页面,从上数第4个,点击扩展(以下通此) 搜索---Chinese--点击---安装--o…...
k8s存储介绍(五)PV与PVC
在 Kubernetes(k8s)中,持久化存储(Persistent Storage)是一个非常重要的概念,因为 Pod 本身是无状态的,重启后会丢失数据。为了支持有状态应用,Kubernetes 提供了持久化存储的机制&a…...
LangChain开发(五)消息管理与聊天历史存储
文章目录 消息存储在内存使用单参数session_id配置会话唯一键 消息持久化到redis安装redis依赖安装redis调用聊天接口,看Redis是否存储历史记录 裁剪消息总结记忆源码地址参考资料 消息存储在内存 我们展示一个简单的示例,其中聊天历史保存在内存中&…...
HTML 表单处理进阶:验证与提交机制的学习心得与进度(一)
引言 在前端开发的广袤领域中,HTML 表单处理堪称基石般的存在,是构建交互性 Web 应用不可或缺的关键环节。从日常频繁使用的登录注册表单,到功能多样的搜索栏、反馈表单,HTML 表单如同桥梁,紧密连接着用户与 Web 应用…...
【文献25/03/26】Hyperspectral Image Transformer Classification Networks
高光谱图像Transformer分类网络 Hyperspectral Image Transformer Classification Networks | IEEE Journals & Magazine | IEEE Xplore 摘要 高光谱图像(HSI)分类是地球观测任务中的一项重要工作。 卷积神经网络(CNN)凭借…...
数字转换(c++)
【题目描述】 如果一个数 xx 的约数和 yy (不包括他本身)比他本身小,那么 xx 可以变成 yy ,yy 也可以变成 xx 。例如 44 可以变为 33 ,11 可以变为 77 。限定所有数字变换在不超过 nn 的正整数范围内进行,…...
WPF ContentPresenter详解2
ContentPresenter与ContentControl的区别 ContentControl 和 ContentPresenter 是 WPF 中两个相关的控件,但它们在用途和功能上有一些关键的区别。理解这两者的区别和联系有助于更好地设计和开发用户界面。 1. 类层次结构 ContentControl:位于 WPF 控件…...
【git】认识git的本地仓库
1.创建本地仓库 git init2. 配置本地仓库 git config user.name xxx git config user.email xxx3. 认识本地仓库 创建完本地仓库后,目录下会有一个.git文件,这个就是本地仓库 而创建本地仓库的目录叫做工作区,我们不能对.git文件进行任何手…...
正则表达式基本语法和Java中的简单使用
先来个例子 public static final Pattern CHINESE_PATTERN Pattern.compile("[\\u4e00-\\u9fa5]"); / 检测字符串是否包含汉字 String text "Hello 世界"; boolean hasChinese CHINESE_PATTERN.matcher(text).find(); // 返回 true// 提取所有汉字 Mat…...
【大模型】什么是循环神经网络(RNNs)
在人工智能(AI)的世界里,**循环神经网络(Recurrent Neural Networks, RNNs)**是一种非常强大的工具,特别适合处理序列数据。无论是语言、时间序列还是音乐,RNNs都能帮助我们理解和预测这些数据的…...
Leetcode 交错字符串
java solution class Solution {public boolean isInterleave(String s1, String s2, String s3) {//首先获取这三个字符串的长度int m s1.length();int n s2.length();int l s3.length();if(m n ! l) return false;//创建dp数组,dp[i][j]其含义是s3的前ij个字符是否可以由…...
Vue动态绑定:文本框、单选按钮、下拉列表、多选按钮
Vue 指令系列文章: 《Vue插值:双大括号标签、v-text、v-html、v-bind 指令》 《Vue指令:v-cloak、v-once、v-pre 指令》 《Vue条件判断:v-if、v-else、v-else-if、v-show 指令》 《Vue循环遍历:v-for 指令》 《Vue事件处理:v-on 指令》 《Vue表单元素绑定:v-model 指令》…...
MySQL - 数据库基础操作
SQL语句 结构化查询语言(Structured Query Language),在关系型数据库上执行数据操作、数据检索以及数据维护的标准语言。 分类 DDL 数据定义语言(Data Definition Language),定义对数据库对象(库、表、列、索引)的操作。 DML 数据操作语言(Data Manip…...