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

使用背景

  1. 平台无关的UI开发:在跨平台应用程序的开发中,UI 经常需要根据不同的平台进行定制,桥接模式可以帮助你将抽象的 UI 元素与具体的平台实现分离,从而实现平台无关的 UI 开发。
  2. 数据库驱动程序:在数据库访问层中,不同的数据库提供商可能有不同的驱动程序和 API,桥接模式可以帮助你将抽象的数据库操作与具体的数据库驱动程序分离,使得代码更易于维护和扩展。
  3. 图形渲染引擎:在图形渲染引擎中,不同的渲染技术(如 DirectX、OpenGL、Vulkan 等)可以作为不同的实现部分,而渲染的对象(如图形、文字、动画等)可以作为抽象部分,桥接模式可以帮助你将抽象的渲染对象与具体的渲染技术分离,从而实现灵活的渲染引擎。
  4. 操作系统内核和文件系统:在操作系统内核中,文件系统的实现可以看作是一个实现部分,而文件操作的接口可以看作是一个抽象部分,桥接模式可以帮助你将文件操作与具体的文件系统实现分离,从而实现对不同文件系统的透明访问。
  5. 远程服务调用:在分布式系统中,远程服务调用可能涉及到不同的网络协议和通信框架,桥接模式可以帮助你将抽象的服务调用与具体的通信实现分离,从而实现对不同通信框架的透明调用。

代码实现

假设我们有一个图形绘制应用程序,它可以在不同的平台上绘制不同类型的图形,如圆形和矩形。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package main

import "fmt"

// Platform 是平台接口
type Platform interface {
DrawCircle(radius int)
DrawRectangle(width, height int)
}

// WindowsPlatform 是 Windows 平台的实现
type WindowsPlatform struct{}

func (w *WindowsPlatform) DrawCircle(radius int) {
fmt.Printf("Drawing Circle on Windows platform with radius %d\n", radius)
}

func (w *WindowsPlatform) DrawRectangle(width, height int) {
fmt.Printf("Drawing Rectangle on Windows platform with width %d and height %d\n", width, height)
}

// LinuxPlatform 是 Linux 平台的实现
type LinuxPlatform struct{}

func (l *LinuxPlatform) DrawCircle(radius int) {
fmt.Printf("Drawing Circle on Linux platform with radius %d\n", radius)
}

func (l *LinuxPlatform) DrawRectangle(width, height int) {
fmt.Printf("Drawing Rectangle on Linux platform with width %d and height %d\n", width, height)
}

// Shape 是图形抽象类
type Shape interface {
Draw()
}

// Circle 是圆形
type Circle struct {
platform Platform
radius int
}

func (c *Circle) Draw() {
c.platform.DrawCircle(c.radius)
}

// Rectangle 是矩形
type Rectangle struct {
platform Platform
width int
height int
}

func (r *Rectangle) Draw() {
r.platform.DrawRectangle(r.width, r.height)
}

func main() {
// 在 Windows 平台上绘制圆形
windowsPlatform := &WindowsPlatform{}
circle := &Circle{platform: windowsPlatform, radius: 5}
circle.Draw()

// 在 Linux 平台上绘制矩形
linuxPlatform := &LinuxPlatform{}
rectangle := &Rectangle{platform: linuxPlatform, width: 10, height: 5}
rectangle.Draw()
}

结语

在实际应用中,桥接模式适用于许多场景,特别是当系统中有多个变化的维度时。例如,跨平台应用程序的开发、数据库访问层的设计、图形渲染引擎的实现等都可以使用桥接模式来实现更灵活、更可扩展的设计。


本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。