[go] 桥接模式

简介: [go] 桥接模式

桥接模式


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


模型说明



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


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


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


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


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


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


优缺点


1.优点


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


2.缺点

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


使用场景


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


参考代码


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


computer.go 抽象部分(高层控制)


package main
import "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 main
import "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 main
import "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 Printer
Print request for mac
Printing by a EPSON Printer
Print request for windows
Printing by a HP Printer
Print request for windows
Printing by a EPSON Printer
相关文章
|
设计模式 Go
Go语言实现设计模式之桥接模式
桥接模式是一种常用的设计模式,用于将抽象部分与其实现部分分离,使它们可以独立变化。本文将详细介绍桥接模式的概念和原理,并使用Go语言实现一个示例,以帮助读者更好地理解该设计模式的应用。
154 0
|
设计模式 缓存 网络协议
Go设计模式(12)-桥接模式
桥接模式并不常用,而且桥接模式的概念比较抽象。桥接模式一般用于有多种分类的情况,如果实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让他们独立变化,减少他们之间的耦合。
|
9天前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
46 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
29天前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
40 7
|
29天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
29天前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
102 71
|
28天前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
106 67
|
1月前
|
Go 索引
go语言for遍历数组或切片
go语言for遍历数组或切片
101 62
|
4天前
|
算法 安全 Go
Go 语言中实现 RSA 加解密、签名验证算法
随着互联网的发展,安全需求日益增长。非对称加密算法RSA成为密码学中的重要代表。本文介绍如何使用Go语言和[forgoer/openssl](https://github.com/forgoer/openssl)库简化RSA加解密操作,包括秘钥生成、加解密及签名验证。该库还支持AES、DES等常用算法,安装简便,代码示例清晰易懂。
32 12
|
29天前
|
存储 Go
go语言中映射
go语言中映射
38 11