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

news2025/2/21 0:27:24

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 bridgedemo

import "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   float32
   Renderer 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    float32
   Height   float32
   Renderer 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  Shape
    color  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 中实现时需注意 组合优于继承 的原则,通过接口定义清晰的抽象边界。当系统存在多个独立变化维度时,桥接模式能显著降低代码复杂度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2300860.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【js逆向_入门】图灵爬虫练习平台 第四题

(base64解码)地址:aHR0cHM6Ly9zdHUudHVsaW5ncHl0b24uY24vcHJvYmxlbS1kZXRhaWwvNC8 请求接口带有加密参数: 全局搜索Sign,找到参数生成位置 一目了然,知道参数是怎么构造生成的 调试代码 测试验证思路是否正确 时间: …

Mybatis后端数据库查询多对多查询解决方案

问题场景: 我开发的是一个论文选择系统。 后端用一个论文表paper来存储论文信息。 论文信息中,包含前置课程,也就是你需要修过这些课程才能选择这个论文。 而一个论文对应的课程有很多个。 这样就造成了一个数据库存储的问题。一个paper…

【MySQL排错 】mysql: command not found 数据库安装后无法加载的解决办法

【MySQL排错 】mysql: command not found 数据库安装后无法加载的解决办法 A Solution to Solve Error - mysql: command not found After The Installation of MySQL Community Server By JacksonML 本文简要介绍如何在macOS安装完毕MySQL数据库服务器后,针对无…

分享一款AI绘画图片展示和分享的小程序

🎨奇绘图册 【开源】一款帮AI绘画爱好者维护绘图作品的小程序 查看Demo 反馈 github 文章目录 前言一、奇绘图册是什么?二、项目全景三、预览体验3.1 截图示例3.2 在线体验 四、功能介绍4.1 小程序4.2 服务端 五、安装部署5.1 快速开始~~5.2 手动部…

大模型知识蒸馏技术(4)——离线蒸馏

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl离线蒸馏概述 离线蒸馏是知识蒸馏中最早被提出且最为常见的实现方式,其核心在于教师模型和学生模型的训练是分阶段进行的。具体而言,教师模型首先在训练集上进行充分训练,直至收敛,然后利用教…

解决DeepSeek服务器繁忙的有效方法

全球42%的企业遭遇过AI工具服务器过载导致内容生产中断(数据来源:Gartner 2025)。当竞品在凌晨3点自动发布「智能家居安装指南」时,你的团队可能正因DeepSeek服务器繁忙错失「净水器保养教程」的流量黄金期⏳。147SEO智能调度系统…

BT401双模音频蓝牙模块如何开启ble的透传,有什么注意事项

BT401音频蓝牙模块如何开启ble的透传? 首先BT401的蓝牙音频模块,分为两个版本,dac版本和iis数字音频版本 DAC版本:就是BT401蓝牙模块【9和10脚】直接输出模拟音频信号,也就是说,直接推动耳机可以听到声音 …

基于SSM框架的宠物之家系统(有源码+论文!!!)

这个系统可以帮助大家去做设计或者学习,大家可以管我要word版论文🥰这里具体论文内照片、e-r图等等加载不进来, 大家如果想要源码+论文+制定+调试,可以私信我!!(可改别的系统,例如调查问卷系统等等) 目录 第1章 绪论 1.1开发背景 1.2开发工具及语言 第2章 宠物之家系…

网工项目理论1.7 设备选型

本专栏持续更新,整一个专栏为一个大型复杂网络工程项目。阅读本文章之前务必先看《本专栏必读》。 一.交换机选型要点 制式:盒式交换机/框式交换机。功能:二层交换机/三层交换机。端口密度:每交换机可以提供的端口数量。端口速率:百兆/千兆/万兆。交换容量:交换矩阵…

Gateway中的Filter机制

Gateway中的Filter机制 文章目录 Gateway中的Filter机制Gateway中的Filter机制Gateway Filter 机制的概述核心思想与设计Filter 的两种类型过滤器的生命周期Gateway Filter 的特点Gateway Filter 的意义Gateway Filter 的工作原理核心架构与执行流程执行流程解析过滤器类型的角…

顺序表常用操作和笔试题

1、顺序表的常用操作 1.1 顺序表的创建 如下代码所示&#xff1a;创建了一个默认空间为10的整型顺序表&#xff0c;如果空间不足则会以1.5倍扩容。 List<Integer> list new ArrayList<>(); 创建一个空间为15的整型顺序表 List<Integer> list2 new ArrayL…

二.数据治理流程架构

1、数据治理流程架构核心思想&#xff1a; 该图描绘了一个以数据标准规范体系为核心&#xff0c;大数据生命周期管理为主线&#xff0c;数据资源中心为依托&#xff0c;并辅以数据质量管理和大数据安全与隐私管理的数据治理流程架构。它旨在通过规范化的流程和技术手段&#x…

解锁机器学习核心算法 | 线性回归:机器学习的基石

在机器学习的众多算法中&#xff0c;线性回归宛如一块基石&#xff0c;看似质朴无华&#xff0c;却稳稳支撑起诸多复杂模型的架构。它是我们初涉机器学习领域时便会邂逅的算法之一&#xff0c;其原理与应用广泛渗透于各个领域。无论是预测房价走势、剖析股票市场波动&#xff0…

CSS 底部颗粒磨砂特效

参考&#xff1a;element-plus的顶部效果 background-image: radial-gradient(transparent 1px, var(--bg-color) 1px); background-size: 4px 4px; backdrop-filter: saturate(50%) blur(4px); 注意点&#xff1a;var(--bg-color) 改为跟你背景色相同的即可。 其他自己看情况…

QT自定义扫描控件,支持任意方位拖动和拖动扫描范围。

部分代码&#xff1a; void FishControlForm::paintEvent(QPaintEvent *event) {QPainter p(this);p.setRenderHints(QPainter::Antialiasing|QPainter::SmoothPixmapTransform);p.translate(m_centerPoint);//bgp.setPen(Qt::white);p.drawEllipse(-m_radius,-m_radius,m_rad…

Ubuntu18.04安装rvm、ruby2.6.5和rails5.2.6

系统环境&#xff1a;Ubuntu 18.04 一、安装前准备 1. sudo apt update 2. sudo apt upgrade 如果提示abort&#xff0c;忽略。 3. sudo apt install sqlite3 gnupg curl git libpq-dev 二、安装rvm ruby版本管理器 1.切换管理员模式 sudo su 2.安装软件签名公钥 gpg…

燧光 XimmerseMR SDK接入Unity

官网SDK文档连接&#xff1a; RhinoX Unity XR SDK 一&#xff1a;下载SDK 下载链接&#xff1a;RhinoX Unity XR SDK 二&#xff1a;打开Unity项目&#xff0c;添加Package 1、先添加XR Core Utilties包和XR Interaction Toolkit包 2、导 2、再导入下载好的燧光SDK 三&…

罗德与施瓦茨ZNB20,矢量网络分析仪9KHz-20GHz

罗德与施瓦茨ZNB20矢量网络分析仪9KHz-20GHz R&SZNB20矢量网络分析仪 产品型号: ZNB20 产品品牌&#xff1a;罗德与施瓦茨 R&S 产品名称: 矢量网络分析仪 频率范围&#xff1a;9kHz - 20GHz R&S ZNB 矢量网络分析仪 良好的测量速度、动态范围和操作方便性&am…

突破平面限制:低空经济激活城市土地“立体生长力”

蓄锐行&#xff1a;我深耕于低空经济领域&#xff0c;同时对IOT技术有着深入的理解&#xff0c;而在AI的探索性研究上&#xff0c;我也已迈出坚实的步伐&#xff0c;虽起步不久&#xff0c;却满怀热情与憧憬。平日里&#xff0c;我热衷于撰写关于低空经济的文章&#xff0c;分享…

可调节图片参数,解决图片模糊及尺寸过小问题的工具

软件介绍 你是否正为图片模糊、尺寸太小而烦恼&#xff1f;别担心&#xff0c;有这样一款神器能帮你轻松解决。它能精准调节图片参数&#xff0c;即便原本模糊不清的图片&#xff0c;经它处理后也能变得高清锐利&#xff0c;瞬间让图片焕然一新。而且&#xff0c;它还具备导出…