Golang学习笔记_33——桥接模式
Golang学习笔记_30——建造者模式
Golang学习笔记_31——原型模式
Golang学习笔记_32——适配器模式
文章目录
- 桥接模式详解
- 一、桥接模式核心概念
- 1. 定义
- 2. 解决的问题
- 3. 核心角色
- 4. 类图
- 二、桥接模式的特点
- 三、适用场景
- 1. 多维度变化
- 2. 跨平台开发
- 3. 动态切换实现
- 四、与其他结构型模式的对比
- 五、Go 语言代码示例
- 六、桥接模式的高级用法
- 1. 多维度组合
- 2. 动态切换实现
- 七、总结
桥接模式详解
一、桥接模式核心概念
1. 定义
桥接模式是一种 结构型设计模式,通过 将抽象部分与实现部分分离,使它们可以独立变化。它通过组合关系替代继承关系,解决多维度的扩展问题。
2. 解决的问题
- 多维度变化:当系统存在多个独立变化的维度时(如形状和颜色),避免类爆炸问题。
- 灵活扩展:允许抽象和实现部分独立扩展,无需修改原有代码。
- 降低耦合:通过组合关系替代继承,减少类之间的强依赖。
3. 核心角色
- Abstraction(抽象化):定义高层抽象接口,维护对实现化对象的引用。
- RefinedAbstraction(扩展抽象化):对抽象化的扩展,提供更精细的控制。
- Implementor(实现化):定义实现类的接口,提供基础操作。
- ConcreteImplementor(具体实现化):实现接口的具体类。
4. 类图


二、桥接模式的特点
优点
- 解耦抽象与实现
抽象层和实现层独立变化,提高系统灵活性。 - 扩展性强
新增维度只需添加对应实现类,无需修改现有代码。 - 符合开闭原则
对扩展开放,对修改关闭。
缺点
- 设计复杂度增加
需要正确识别系统中独立变化的维度。 - 理解成本高
组合关系比继承更难直观理解。
三、适用场景
1. 多维度变化
- 示例:图形绘制系统(形状 × 颜色 × 渲染引擎)
- 解决:将形状作为抽象,颜色和渲染作为独立实现。
2. 跨平台开发
- 示例:支持 Android/iOS 的 UI 组件库
- 解决:UI 组件抽象与平台具体实现分离。
3. 动态切换实现
- 示例:数据库驱动切换(MySQL/PostgreSQL)
- 解决:通过桥接接口动态替换底层实现。
四、与其他结构型模式的对比
| 模式 | 核心目标 | 关键区别 |
|---|---|---|
| 适配器 | 解决接口不兼容问题 | 关注接口转换,通常在系统设计后期使用 |
| 组合 | 处理树形结构 | 强调部分与整体的层次关系 |
| 桥接 | 分离抽象与实现 | 关注多维度的独立扩展 |
五、Go 语言代码示例
场景描述
实现跨平台图形渲染系统,支持不同形状(圆形/矩形)在不同平台(Windows/Linux)的绘制。
代码实现
package bridgedemoimport "fmt"// Renderer 渲染器接口
type Renderer interface {RenderCircle(radius float32)RenderRectangle(width, height float32)
}// WindowsRenderer windows渲染器实现
type WindowsRenderer struct{}func (w *WindowsRenderer) RenderCircle(radius float32) {// 渲染windows矩形的实现fmt.Printf("windows render circle: radius = %f\n", radius)
}func (w *WindowsRenderer) RenderRectangle(width, height float32) {// 渲染Windows矩形的实现fmt.Printf("windows render rectangle: width = %f, height = %f\n", width, height)
}// LinuxRenderer linux渲染器实现
type LinuxRenderer struct{}func (l *LinuxRenderer) RenderCircle(radius float32) {// 渲染Linux圆形的实现fmt.Printf("linux render circle: radius = %f\n", radius)
}func (l *LinuxRenderer) RenderRectangle(width, height float32) {// 渲染Linux矩形的实现fmt.Printf("linux render rectangle: width = %f, height = %f\n", width, height)
}// Shape 图形接口
type Shape interface {Draw()
}// Circle 圆形
type Circle struct {Radius float32Renderer Renderer
}func NewCircle(radius float32, renderer Renderer) *Circle {return &Circle{Radius: radius,Renderer: renderer,}
}func (c *Circle) Draw() {c.Renderer.RenderCircle(c.Radius)
}// Rectangle 矩形
type Rectangle struct {Width float32Height float32Renderer Renderer
}func newRectangle(width, height float32, renderer Renderer) *Rectangle {return &Rectangle{Width: width,Height: height,Renderer: renderer,}
}func (r *Rectangle) Draw() {r.Renderer.RenderRectangle(r.Width, r.Height)
}func test() {// 创建Windows渲染器windowsRenderer := &WindowsRenderer{}// 创建Linux渲染器linuxRenderer := &LinuxRenderer{}// 创建跨平台图形shapes := []Shape{NewCircle(5.0, windowsRenderer),NewCircle(8.0, linuxRenderer),newRectangle(10.0, 20.0, windowsRenderer),newRectangle(15.0, 25.0, linuxRenderer),}// 绘制图形for _, shape := range shapes {shape.Draw()}
}
输出结果
=== RUN Test_test
windows render circle: radius = 5.000000
linux render circle: radius = 8.000000
windows render rectangle: width = 10.000000, height = 20.000000
linux render rectangle: width = 15.000000, height = 25.000000
--- PASS: Test_test (0.00s)
PASS
六、桥接模式的高级用法
1. 多维度组合
// 添加颜色维度
type ColorImplementor interface {SetColor(color string)
}type ColoredShape struct {shape Shapecolor string
}func (c *ColoredShape) Draw() {fmt.Printf("设置颜色: %s\n", c.color)c.shape.Draw()
}
2. 动态切换实现
// 运行时切换渲染引擎
rect := NewRectangle(winRenderer, 15, 25)
rect.Draw() // Windows渲染rect.renderer = linuxRenderer
rect.Draw() // Linux渲染
七、总结
桥接模式通过 分离抽象与实现 解决多维度扩展问题,特别适合以下场景:
- 多维度变化:独立管理不同维度的变化
- 跨平台开发:统一抽象接口,差异化实现
- 动态配置:运行时切换实现逻辑
在 Go 中实现时需注意 组合优于继承 的原则,通过接口定义清晰的抽象边界。当系统存在多个独立变化维度时,桥接模式能显著降低代码复杂度。
相关文章:
Golang学习笔记_33——桥接模式
Golang学习笔记_30——建造者模式 Golang学习笔记_31——原型模式 Golang学习笔记_32——适配器模式 文章目录 桥接模式详解一、桥接模式核心概念1. 定义2. 解决的问题3. 核心角色4. 类图 二、桥接模式的特点三、适用场景1. 多维度变化2. 跨平台开发3. 动态切换实现 四、与其他…...
蜂鸟视图发布AI智能导购产品:用生成式AI重构空间服务新范式
在人工智能技术飞速发展的今天,北京蜂鸟视图正式宣布推出基于深度求索(DeepSeek)等大模型的《AI智能导购产品》,通过生成式AI与室内三维地图的深度融合,重新定义空间场景的智能服务体验。 这一创新产品将率先应用于购物…...
AI服务器散热黑科技:让芯片“冷静”提速
AI 服务器为何需要散热黑科技 在人工智能飞速发展的当下,AI 服务器作为核心支撑,作用重大。从互联网智能推荐,到医疗疾病诊断辅助,从金融风险预测,到教育个性化学习,AI 服务器广泛应用,为各类复…...
数据结构-栈、队列、哈希表
1栈 1.栈的概念 1.1栈:在表尾插入和删除操作受限的线性表 1.2栈逻辑结构: 线性结构(一对一) 1.3栈的存储结构:顺序存储(顺序栈)、链表存储(链栈) 1.4栈的特点: 先进后出(fisrt in last out FILO表),后进先出 //创建栈 Stacklist create_stack() {Stacklist lis…...
安装海康威视相机SDK后,catkin_make其他项目时,出现“libusb_set_option”错误的解决方法
硬件:雷神MIX G139H047LD 工控机 系统:ubuntu20.04 之前运行某项目时,处于正常状态。后来由于要使用海康威视工业相机(型号:MV-CA013-21UC),便下载了并安装了该相机的SDK,之后运行…...
【鸿蒙】ArkUI-X跨平台问题集锦
系列文章目录 【鸿蒙】ArkUI-X跨平台问题集锦 文章目录 系列文章目录前言问题集锦1、HSP,HAR模块中 无法引入import bridge from arkui-x.bridge;2、CustomDialog 自定义弹窗中的点击事件在Android 中无任何响应;3、调用 buildRouterMode() 路由跳转页面前…...
大模型驱动的业务自动化
大模型输出token的速度太低且为统计输出,所以目前大模型主要应用在toP(人)的相关领域;但其智能方面的优势又是如此的强大,自然就需要尝试如何将其应用到更加广泛的toM(物理系统、生产系统)领域中…...
ocr智能票据识别系统|自动化票据识别集成方案
在企业日常运营中,对大量票据实现数字化管理是一项耗时且容易出错的任务。随着技术的进步,OCR(光学字符识别)智能票据识别系统的出现为企业提供了一个高效、准确的解决方案,不仅简化了财务流程,还大幅提升了…...
[数据结构]红黑树,详细图解插入
目录 一、红黑树的概念 二、红黑树的性质 三、红黑树节点的定义 四、红黑树的插入(步骤) 1.为什么新插入的节点必须给红色? 2、插入红色节点后,判定红黑树性质是否被破坏 五、插入出现连续红节点情况分析图解(看…...
【机器学习】超参数调优指南:交叉验证,网格搜索,混淆矩阵——基于鸢尾花与数字识别案例的深度解析
一、前言:为何要学交叉验证与网格搜索? 大家好!在机器学习的道路上,我们经常面临一个难题:模型调参。比如在 KNN 算法中,选择多少个邻居(n_neighbors)直接影响预测效果。 • 蛮力猜…...
Burp Suite基本使用(web安全)
工具介绍 在网络安全的领域,你是否听说过抓包,挖掘漏洞等一系列的词汇,这篇文章将带你了解漏洞挖掘的热门工具——Burp Suite的使用。 Burp Suite是一款由PortSwigger Web Security公司开发的集成化Web应用安全检测工具,它主要用于…...
React实现自定义图表(线状+柱状)
要使用 React 绘制一个结合线状图和柱状图的图表,你可以使用 react-chartjs-2 库,它是基于 Chart.js 的 React 封装。以下是一个示例代码,展示如何实现这个需求: 1. 安装依赖 首先,你需要安装 react-chartjs-2 和 ch…...
从低清到4K的魔法:FlashVideo突破高分辨率视频生成计算瓶颈(港大港中文字节)
论文链接:https://arxiv.org/pdf/2502.05179 项目链接:https://github.com/FoundationVision/FlashVideo 亮点直击 提出了 FlashVideo,一种将视频生成解耦为两个目标的方法:提示匹配度和视觉质量。通过在两个阶段分别调整模型规模…...
Qt的QTabWidget的使用
在PyQt5中,QTabWidget 是一个用于管理多个选项卡页面的容器控件。以下是其使用方法的详细说明和示例: 1. 基本用法 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QWidget, QLabel, QVBoxLayoutclass MainWindow(QMa…...
Next.js【详解】获取数据(访问接口)
Next.js 中分为 服务端组件 和 客户端组件,内置的获取数据各不相同 服务端组件 方式1 – 使用 fetch export default async function Page() {const data await fetch(https://api.vercel.app/blog)const posts await data.json()return (<ul>{posts.map((…...
反向代理模块kd
1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说,反向代理就相当于…...
leaflet前端初始化项目
1、通过npm安装leaflet包,或者直接在项目中引入leaflet.js库文件。 npm 安装:npm i leaflet 如果在index.html中引入leaflet.js,在项目中可以直接使用变量L. 注意:尽量要么使用npm包,要么使用leaflet.js库,两者一起使用容易发生…...
CMS DTcms 靶场(弱口令、文件上传、tasklist提权、开启远程桌面3389、gotohttp远程登录控制)
环境说明 攻击机kali:192.168.111.128 信息收集 主机发现 ┌──(root㉿kali-plus)-[~/Desktop] └─# nmap -sP 192.168.111.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-23 14:57 CST Nmap scan report for 192.168.111.1 Host is up (0.00039s latenc…...
Docker 入门与实战:从安装到容器管理的完整指南
🚀 Docker 入门与实战:从安装到容器管理的完整指南 🌟 📖 简介 在现代软件开发中,容器化技术已经成为不可或缺的一部分。而 Docker 作为容器化领域的领头羊,以其轻量级、高效和跨平台的特性,深…...
git删除本地分支
一、命令方式 1、查看本地分支 git branch 2、切换到一个不删除的分支 git checkout branch_name 3、强制删除分支 git branch -D local_branch_name 二、工具方式 1、选择"Browse references",右键"Delete branch"...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...
