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

[复制链接]
发表于 2025-10-29 14:51:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Golang学习条记_30——制作者模式
Golang学习条记_31——原型模式
Golang学习条记_32——适配器模式




桥接模式详解

一、桥接模式核心概念

1. 界说

桥接模式是一种 结构型计划模式,通过 将抽象部门与实现部门分离,使它们可以独立变革。它通过组合关系替换继续关系,办理多维度的扩展题目。
2. 办理的题目



  • 多维度变革:当体系存在多个独立变革的维度时(如形状和颜色),制止类爆炸题目。
  • 机动扩展:答应抽象和实现部门独立扩展,无需修改原有代码。
  • 低落耦合:通过组合关系替换继续,镌汰类之间的强依靠。
3. 核心脚色


  • Abstraction(抽象化):界说高层抽象接口,维护对实现化对象的引用。
  • RefinedAbstraction(扩展抽象化):对抽象化的扩展,提供更风雅的控制。
  • Implementor(实现化):界说实现类的接口,提供根本利用。
  • ConcreteImplementor(具体实现化):实现接口的具体类。
4. 类图



二、桥接模式的特点

长处

  • 解耦抽象与实现
    抽象层和实现层独立变革,进步体系机动性。
  • 扩展性强
    新增维度只需添加对应实现类,无需修改现有代码。
  • 符合开闭原则
    对扩睁开放,对修改关闭。
缺点

  • 计划复杂度增长
    须要精确辨认体系中独立变革的维度。
  • 明确本钱高
    组合关系比继续更难直观明确。
三、实用场景

1. 多维度变革



  • 示例:图形绘制体系(形状 × 颜色 × 渲染引擎)
  • 办理:将形状作为抽象,颜色和渲染作为独立实现。
2. 跨平台开发



  • 示例:支持 Android/iOS 的 UI 组件库
  • 办理:UI 组件抽象与平台具体实现分离。
3. 动态切换实现



  • 示例:数据库驱动切换(MySQL/PostgreSQL)
  • 办理:通过桥接接口动态更换底层实现。
四、与其他结构型模式的对比

模式核心目的关键区别适配器办理接口不兼容题目关注接口转换,通常在体系计划后期利用组合处置惩罚树形结构夸大部门与团体的条理关系桥接分离抽象与实现关注多维度的独立扩展五、Go 语言代码示例

场景形貌
实现跨平台图形渲染体系,支持差别形状(圆形/矩形)在差别平台(Windows/Linux)的绘制。
代码实现
  1. package bridgedemo
  2. import "fmt"
  3. // Renderer 渲染器接口
  4. type Renderer interface {
  5.    RenderCircle(radius float32)
  6.    RenderRectangle(width, height float32)
  7. }
  8. // WindowsRenderer windows渲染器实现
  9. type WindowsRenderer struct{}
  10. func (w *WindowsRenderer) RenderCircle(radius float32) {
  11.    // 渲染windows矩形的实现
  12.    fmt.Printf("windows render circle: radius = %f\n", radius)
  13. }
  14. func (w *WindowsRenderer) RenderRectangle(width, height float32) {
  15.    // 渲染Windows矩形的实现
  16.    fmt.Printf("windows render rectangle: width = %f, height = %f\n", width, height)
  17. }
  18. // LinuxRenderer linux渲染器实现
  19. type LinuxRenderer struct{}
  20. func (l *LinuxRenderer) RenderCircle(radius float32) {
  21.    // 渲染Linux圆形的实现
  22.    fmt.Printf("linux render circle: radius = %f\n", radius)
  23. }
  24. func (l *LinuxRenderer) RenderRectangle(width, height float32) {
  25.    // 渲染Linux矩形的实现
  26.    fmt.Printf("linux render rectangle: width = %f, height = %f\n", width, height)
  27. }
  28. // Shape 图形接口
  29. type Shape interface {
  30.    Draw()
  31. }
  32. // Circle 圆形
  33. type Circle struct {
  34.    Radius   float32
  35.    Renderer Renderer
  36. }
  37. func NewCircle(radius float32, renderer Renderer) *Circle {
  38.    return &Circle{
  39.       Radius:   radius,
  40.       Renderer: renderer,
  41.    }
  42. }
  43. func (c *Circle) Draw() {
  44.    c.Renderer.RenderCircle(c.Radius)
  45. }
  46. // Rectangle 矩形
  47. type Rectangle struct {
  48.    Width    float32
  49.    Height   float32
  50.    Renderer Renderer
  51. }
  52. func newRectangle(width, height float32, renderer Renderer) *Rectangle {
  53.    return &Rectangle{
  54.       Width:    width,
  55.       Height:   height,
  56.       Renderer: renderer,
  57.    }
  58. }
  59. func (r *Rectangle) Draw() {
  60.    r.Renderer.RenderRectangle(r.Width, r.Height)
  61. }
  62. func test() {
  63.    // 创建Windows渲染器
  64.    windowsRenderer := &WindowsRenderer{}
  65.    // 创建Linux渲染器
  66.    linuxRenderer := &LinuxRenderer{}
  67.    // 创建跨平台图形
  68.    shapes := []Shape{
  69.       NewCircle(5.0, windowsRenderer),
  70.       NewCircle(8.0, linuxRenderer),
  71.       newRectangle(10.0, 20.0, windowsRenderer),
  72.       newRectangle(15.0, 25.0, linuxRenderer),
  73.    }
  74.    // 绘制图形
  75.    for _, shape := range shapes {
  76.       shape.Draw()
  77.    }
  78. }
复制代码
输出效果
  1. === RUN   Test_test
  2. windows render circle: radius = 5.000000
  3. linux render circle: radius = 8.000000
  4. windows render rectangle: width = 10.000000, height = 20.000000
  5. linux render rectangle: width = 15.000000, height = 25.000000
  6. --- PASS: Test_test (0.00s)
  7. PASS
复制代码
六、桥接模式的高级用法

1. 多维度组合

  1. // 添加颜色维度
  2. type ColorImplementor interface {
  3.     SetColor(color string)
  4. }
  5. type ColoredShape struct {
  6.     shape  Shape
  7.     color  string
  8. }
  9. func (c *ColoredShape) Draw() {
  10.     fmt.Printf("设置颜色: %s\n", c.color)
  11.     c.shape.Draw()
  12. }
复制代码
2. 动态切换实现

  1. // 运行时切换渲染引擎
  2. rect := NewRectangle(winRenderer, 15, 25)
  3. rect.Draw() // Windows渲染
  4. rect.renderer = linuxRenderer
  5. rect.Draw() // Linux渲染
复制代码
七、总结

桥接模式通过 分离抽象与实现 办理多维度扩展题目,特别得当以了局景:

  • 多维度变革:独立管理差别维度的变革
  • 跨平台开发:同一抽象接口,差别化实现
  • 动态设置:运行时切换实现逻辑
在 Go 中实现时需留意 组合优于继续 的原则,通过接口界说清楚的抽象界限。当体系存在多个独立变革维度时,桥接模式能明显低落代码复杂度。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表