桥接模式(Bridge Design Pattern)
桥接模式将抽象部分与它的实现部分分离,使功能实现独立于接口。
解决的问题
如果直接实现接口,扩展起来不灵活。这种情况下可以将实现分离出来,减少它们之间的耦合。桥接模式是为了让类的职责更单一,维护更方便。
代码示例
我们以汽车为例, 汽车可以安装、切换不同的发动机,汽车是不需要实现发动接口的,只需要在汽车上装载一个发动机,然后汽车可直接通过调用发动机来启动它,这样汽车和发动机就实现进行分离,减少了耦合。假如说Geely汽车目前使用的是国产的发动机,现在它要换成Volvo的发动机:
package bridge
import "fmt"
//汽车抽象
type Car interface {
UseEngine(Engine)
Start()
}
//发动机
type Engine interface {
Start()
}
//Volvo发动机
type VolvoEngine struct{}
//发动机启动
func (v VolvoEngine) Start() {
fmt.Println("Start Volvo Engine")
}
//吉利汽车
type GeelyCar struct {
Engine Engine
}
//使用什么发动机
func (g *GeelyCar) UseEngine(engine Engine) {
g.Engine = engine
}
//汽车启动
func (g GeelyCar) Start() {
g.Engine.Start()
fmt.Println("GeelyCar Started")
}
输出:
var volvoEngine Engine = &VolvoEngine{}
var geelyCar Car = &GeelyCar{}
geelyCar.UseEngine(volvoEngine)
geelyCar.Start()
// Output:
// Start Volvo Engine
// GeelyCar Started