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

[go] 桥接模式

桥接模式

是一种结构型设计模式, 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构, 从而能在开发时分别使用。

模型说明

  • 抽象部分(Abstraction)提供高层控制逻辑,依赖于完成底层实际工作的实现对象。

  • 实现部分(Implementation)为所有具体实现声明通用接口。抽象部分仅能通过在这里声明的方法与实现对象交互。

  • 抽象部分可以列出和实现部分一样的方法,但是抽象部分通常声明一些复杂行为,这些行为依赖于多种由实现部分声明的原语操作。

  • 具体实现(Concrete Implementations)中包括特定于平台的代码。

  • 精确抽象(Refined Abstraction)提供控制逻辑的变体。与其父类一样,它们通过通用实现接口与不同的实现进行交互。

  • 通常情况下,客户端(Client)仅关心如何与抽象部分合作。但是,客户端需要将抽象对象与一个实现对象连接起来。

优缺点

1.优点

  • 你可以创建与平台无关的类和程序。
  • 客户端代码仅与高层抽象部分进行互动,不会接触到平台的详细信息。
  • *开闭原则:*你可以新增抽象部分和实现部分,且它们之间不会相互影响。
  • *单一职责原则:*抽象部分专注于处理高层逻辑, 实现部分处理平台细节。

2.缺点

  • 对高内聚的类使用该模式可能会让代码更加复杂。

使用场景

  • 如果你想要拆分或重组一个具有多重功能的庞杂类(例如能与多个数据库服务器进行交互的类),可以使用桥接模式。
  • 如果你希望在几个独立维度上扩展一个类,可使用该模式。
  • 如果你需要在运行时切换不同实现方法,可使用桥接模式。

参考代码

如果我们有一台Mac和一台Windows。还有两台打印机:爱普生和惠普。这两台电脑和打印机可能会任意组合使用。 客户端不应去担心如何将打印机连接至计算机的细节问题。
computer.go 抽象部分(高层控制)

package mainimport "fmt"type Computer interface {Print()SetPrinter(Printer)
}type Mac struct {printer Printer
}func (m *Mac) Print() {fmt.Println("Print request for mac")m.printer.PrintFile()
}func (m *Mac) SetPrinter(p Printer) {m.printer = p
}type Windows struct {printer Printer
}func (w *Windows) Print() {fmt.Println("Print request for windows")w.printer.PrintFile()
}func (w *Windows) SetPrinter(p Printer) {w.printer = p
}

priter.go 实现部分(底层实际工作)

package mainimport "fmt"type Printer interface {PrintFile()
}type Epson struct{}func (p *Epson) PrintFile() {fmt.Println("Printing by a EPSON Printer")
}type Hp struct{}func (p *Hp) PrintFile() {fmt.Println("Printing by a HP Printer")
}

main.go 客户端

package mainimport "fmt"func main() {hpPrinter := &Hp{}epsonPrinter := &Epson{}macComputer := &Mac{}macComputer.SetPrinter(hpPrinter)macComputer.Print()fmt.Println()macComputer.SetPrinter(epsonPrinter)macComputer.Print()fmt.Println()winComputer := &Windows{}winComputer.SetPrinter(hpPrinter)winComputer.Print()fmt.Println()winComputer.SetPrinter(epsonPrinter)winComputer.Print()fmt.Println()
}

output:

Print request for mac
Printing by a HP PrinterPrint request for mac
Printing by a EPSON PrinterPrint request for windows
Printing by a HP PrinterPrint request for windows
Printing by a EPSON Printer
http://www.xdnf.cn/news/17949.html

相关文章:

  • 分布式存储与存储阵列:从传统到现代的存储革命
  • Tello无人机与LLM模型控制 ROS
  • 安全审计-iptales防火墙设置
  • 立体匹配中的稠密匹配和稀疏匹配
  • 教材采购管理系统(java)
  • 力扣(接雨水)——基于最高柱分割的双指针
  • Python - 100天从新手到大师:第十一天常用数据结构之字符串
  • Flink Stream API 源码走读 - 总结
  • 双指针和codetop复习
  • Day56 Java面向对象10 方法重写
  • Vue组件基础解析
  • [系统架构设计师]系统质量属性与架构评估(八)
  • Python语言---OrangePi全志H616
  • MySQL锁机制:悲观锁VS乐观锁详解
  • vector 手动实现 及遇到的各种细节问题
  • Azure AI Search 探索总结
  • 通配符 重定向 管道符
  • 数字分类:机器学习经典案例解析
  • vscode中使用CMake Tools生成compile_commands.json文件后,如何告诉clangd这个文件在哪里呢?
  • 【Linux系统】进程间通信:System V IPC——共享内存
  • 23. CommonJS 和 ES6 Module 区别
  • [1Prompt1Story] 生成行为控制器 | 语义向量重加权(SVR)
  • 【计算机视觉与深度学习实战】03基于Canny、Sobel和Laplacian算子的边缘检测系统设计与实现
  • Day11 栈与队列part2
  • duiLib 实现鼠标拖动状态栏时,窗口跟着拖动
  • webrtc弱网-VideoSendStreamImpl类源码分析与算法原理
  • 《Leetcode》-面试题-hot100-技巧
  • 嵌入式硬件篇---常见的单片机型号
  • 按键及消抖
  • Python环境下载安装、以及环境配置教程(Windows版)