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"...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...