当前位置: 首页 > news >正文

Golang学习笔记_33——桥接模式

Golang学习笔记_30——建造者模式
Golang学习笔记_31——原型模式
Golang学习笔记_32——适配器模式


文章目录

  • 桥接模式详解
    • 一、桥接模式核心概念
      • 1. 定义
      • 2. 解决的问题
      • 3. 核心角色
      • 4. 类图
    • 二、桥接模式的特点
    • 三、适用场景
      • 1. 多维度变化
      • 2. 跨平台开发
      • 3. 动态切换实现
    • 四、与其他结构型模式的对比
    • 五、Go 语言代码示例
    • 六、桥接模式的高级用法
      • 1. 多维度组合
      • 2. 动态切换实现
    • 七、总结


桥接模式详解

一、桥接模式核心概念

1. 定义

桥接模式是一种 结构型设计模式,通过 将抽象部分与实现部分分离,使它们可以独立变化。它通过组合关系替代继承关系,解决多维度的扩展问题。

2. 解决的问题

  • 多维度变化:当系统存在多个独立变化的维度时(如形状和颜色),避免类爆炸问题。
  • 灵活扩展:允许抽象和实现部分独立扩展,无需修改原有代码。
  • 降低耦合:通过组合关系替代继承,减少类之间的强依赖。

3. 核心角色

  1. Abstraction(抽象化):定义高层抽象接口,维护对实现化对象的引用。
  2. RefinedAbstraction(扩展抽象化):对抽象化的扩展,提供更精细的控制。
  3. Implementor(实现化):定义实现类的接口,提供基础操作。
  4. ConcreteImplementor(具体实现化):实现接口的具体类。

4. 类图

桥接模式类图

示例类图

二、桥接模式的特点

优点

  1. 解耦抽象与实现
    抽象层和实现层独立变化,提高系统灵活性。
  2. 扩展性强
    新增维度只需添加对应实现类,无需修改现有代码。
  3. 符合开闭原则
    对扩展开放,对修改关闭。

缺点

  1. 设计复杂度增加
    需要正确识别系统中独立变化的维度。
  2. 理解成本高
    组合关系比继承更难直观理解。

三、适用场景

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渲染

七、总结

桥接模式通过 分离抽象与实现 解决多维度扩展问题,特别适合以下场景:

  1. 多维度变化:独立管理不同维度的变化
  2. 跨平台开发:统一抽象接口,差异化实现
  3. 动态配置:运行时切换实现逻辑

在 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() 路由跳转页面前&#xf…...

大模型驱动的业务自动化

大模型输出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 中分为 服务端组件 和 客户端组件&#xff0c;内置的获取数据各不相同 服务端组件 方式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 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…...

leaflet前端初始化项目

1、通过npm安装leaflet包&#xff0c;或者直接在项目中引入leaflet.js库文件。 npm 安装&#xff1a;npm i leaflet 如果在index.html中引入leaflet.js,在项目中可以直接使用变量L. 注意:尽量要么使用npm包&#xff0c;要么使用leaflet.js库&#xff0c;两者一起使用容易发生…...

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 入门与实战:从安装到容器管理的完整指南

&#x1f680; Docker 入门与实战&#xff1a;从安装到容器管理的完整指南 &#x1f31f; &#x1f4d6; 简介 在现代软件开发中&#xff0c;容器化技术已经成为不可或缺的一部分。而 Docker 作为容器化领域的领头羊&#xff0c;以其轻量级、高效和跨平台的特性&#xff0c;深…...

git删除本地分支

一、命令方式 1、查看本地分支 git branch 2、切换到一个不删除的分支 git checkout branch_name 3、强制删除分支 git branch -D local_branch_name 二、工具方式 1、选择"Browse references"&#xff0c;右键"Delete branch"...

Spring Boot项目里用FFmpegFrameGrabber处理视频,这5个实用方法你用过吗?

Spring Boot中FFmpegFrameGrabber的5个高阶实战技巧 在视频处理后台开发中&#xff0c;我们常常会遇到各种棘手问题&#xff1a;老式隔行扫描视频的画质优化、特殊格式文件的兼容性处理、网络流媒体的稳定读取等。这些场景恰恰是检验开发者对FFmpegFrameGrabber掌握深度的试金石…...

bitset的数据结构用法

一&#xff0c;bitset本质bitset 定长二进制数组&#xff08;0/1&#xff09; 位运算加速类似&#xff1a;bool a[N];但支持批量位运算&#xff08;64位/128位并行&#xff09;二&#xff0c;定义 & 初始化bitset<1000>b; //全0bitset<1000>b("10…...

用STM32F103C8T6+LD3320做个会说话的智能垃圾桶,附完整代码和接线图

从零打造会说话的智能垃圾桶&#xff1a;STM32F103C8T6与LD3320实战指南 1. 项目构思与核心组件解析 去年夏天&#xff0c;我在小区垃圾分类站观察到一个有趣现象&#xff1a;尽管分类标识清晰&#xff0c;仍有近半数居民会随手将垃圾扔进错误桶内。这个发现促使我萌生了制作智…...

别只盯着AC仿真了!用Cadence STB和Noise分析,搞定ClassAB输出运放的稳定性与噪声难题

别只盯着AC仿真了&#xff01;用Cadence STB和Noise分析&#xff0c;搞定ClassAB输出运放的稳定性与噪声难题 ClassAB输出级运放因其高驱动能力和低静态功耗的优势&#xff0c;在模拟IC设计中占据重要地位。然而&#xff0c;许多工程师在设计这类运放时&#xff0c;往往陷入AC仿…...

5分钟掌握知网文献批量下载:CNKI-download自动化工具完全指南

5分钟掌握知网文献批量下载&#xff1a;CNKI-download自动化工具完全指南 【免费下载链接】CNKI-download :frog: 知网(CNKI)文献下载及文献速览爬虫 (Web Scraper for Extracting Data) 项目地址: https://gitcode.com/gh_mirrors/cn/CNKI-download 你是否还在为手动下…...

PHP+AI代码审计实战手册(2024 OWASP Top 10适配版)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;PHPAI代码审计的范式变革与安全挑战 传统PHP代码审计长期依赖人工规则匹配与经验驱动&#xff0c;面对现代框架&#xff08;如Laravel、Symfony&#xff09;的动态路由、魔术方法和反射调用&#xff0c…...

Android系统去广告技术深度解析:Universal Android Debloater架构设计与实现原理

Android系统去广告技术深度解析&#xff1a;Universal Android Debloater架构设计与实现原理 【免费下载链接】universal-android-debloater Cross-platform GUI written in Rust using ADB to debloat non-rooted android devices. Improve your privacy, the security and ba…...

你的样本量够吗?WGCNA分析前必须搞清楚的5个关键问题与实战策略

WGCNA分析前的5个关键评估&#xff1a;如何避免无效分析并优化实验设计 当你第一次听说WGCNA这个强大的共表达网络分析工具时&#xff0c;可能已经迫不及待想在自己的数据集上尝试。但先别急着运行代码——我见过太多研究者因为前期准备不足&#xff0c;花费数周时间却得到毫无…...

PocketSphinx语音识别技术深度解析:轻量级离线语音识别的5大核心特性

PocketSphinx语音识别技术深度解析&#xff1a;轻量级离线语音识别的5大核心特性 【免费下载链接】pocketsphinx A small speech recognizer 项目地址: https://gitcode.com/gh_mirrors/po/pocketsphinx PocketSphinx是卡内基梅隆大学开发的开源大词汇量、说话人无关的连…...

车载DMS为什么成为安全刚需?移远通信全栈边缘AI模组给出答案

据相关统计&#xff0c;大约20%的交通事故与驾驶员疲劳或分心有关。当驾驶员出现打哈欠、视线偏离、长时间闭眼等行为时&#xff0c;若车辆能实时监测并主动预警&#xff0c;可大幅降低事故风险。这正是车载DMS&#xff08;驾驶员监控系统&#xff09;的核心价值——通过摄像头…...