结构型 桥接模式

为什么需要桥接模式

桥接模式主要是分离抽象和实现部分,两部分可以独立扩展。

桥接模式模式最常用的地方应该是驱动实现吧,例如业务程序可以去调动驱动程序代码,但是驱动程序代码的底层实现是可以加载具体的实现库,例如你可以加载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

Previous
Next