桥接模式(Bridge Pattern)是一种结构型设计模式,旨在将抽象部分与实现部分分离,使它们都可以独立变化。通过组合的方式建立两个类之间的关系,而不是继承。
抽象部分和实现部分可以独立扩展,互不影响。
通过组合而非继承,可以在运行时动态切换实现部分。
避免因多维度变化导致的类数量激增问题。
当一个类存在多个独立变化的维度时,可以通过桥接模式将这些维度分离。例如: - 图形绘制系统中,图形类型(圆形、矩形)和绘制方式(实线、虚线)是两个独立变化的维度。
如果需要在运行时根据需求选择不同的实现,桥接模式非常适合。例如: - 数据库访问层支持多种数据库(MySQL、PostgreSQL),并且需要动态切换。
当类的继承层次过于复杂或难以维护时,可以使用桥接模式替代继承。
在跨平台应用中,UI组件和底层操作系统接口可以通过桥接模式分离。例如: - UI框架(抽象部分)和不同操作系统的实现(Windows、Linux、macOS)。
package main
import "fmt"
// 实现部分接口
type Device interface {
TurnOn()
TurnOff()
}
// 具体实现:电视
type TV struct{}
func (t *TV) TurnOn() {
fmt.Println("TV is turned on")
}
func (t *TV) TurnOff() {
fmt.Println("TV is turned off")
}
// 具体实现:收音机
type Radio struct{}
func (r *Radio) TurnOn() {
fmt.Println("Radio is turned on")
}
func (r *Radio) TurnOff() {
fmt.Println("Radio is turned off")
}
// 抽象部分,通过组合来实现
type RemoteControl struct {
device Device // 组合实现部分
}
func (rc *RemoteControl) TurnOn() {
rc.device.TurnOn()
}
func (rc *RemoteControl) TurnOff() {
rc.device.TurnOff()
}
func main() {
// 使用桥接模式
tv := &TV{}
radio := &Radio{}
remoteForTV := &RemoteControl{device: tv}
remoteForTV.TurnOn()
remoteForTV.TurnOff()
remoteForRadio := &RemoteControl{device: radio}
remoteForRadio.TurnOn()
remoteForRadio.TurnOff()
}