结构型 桥接模式
为什么需要桥接模式
桥接模式主要是分离抽象和实现部分,两部分可以独立扩展。
桥接模式模式最常用的地方应该是驱动实现吧,例如业务程序可以去调动驱动程序代码,但是驱动程序代码的底层实现是可以加载具体的实现库,例如你可以加载mysql也可以加载oracle。
对于Golang来说,我们应该会见到采用_
这种方式来注册驱动的方法,这个是利用了Golang在调用一个package的时候首先会运行init函数。我们可以在这个时候趁机注册我们想要的具体驱动。
实现
这个实现需要结合driver 和 driver_test。在这个例子中,Driver和Computer可以格子独立开发扩展。
两个包来看,我在test中实现了一个driver并且采用init 来注册。
go.mod
module bridge
go 1.13
bridge.go
package bridge
type Driver interface {
Run() string
}
type Computer interface {
Do() string
}
type Macbook struct {
driver Driver
name string
}
func (m *Macbook) Do() string {
return m.name + ":" + m.driver.Run()
}
// we can wrap it like a driver use case
var macbookInstance *Macbook
func Register(driver Driver) {
macbookInstance = &Macbook{
name: "Mac",
driver: driver,
}
}
func Action() string {
return macbookInstance.Do()
}
bridge_test.go
package bridge_test
import (
"bridge"
"testing"
)
type DriverImpl struct {
}
func (d *DriverImpl) Run() string {
return "Driver Impl"
}
func init() {
// this is the driver trick
bridge.Register(&DriverImpl{})
}
func TestBridge(t *testing.T) {
result := bridge.Action()
if result != "Mac:Driver Impl" {
t.Fatal("Bridge is not correctly implemented:" + result)
}
}
执行:
go test bridge -v