跳转至

3.桥接模式

一 桥接模式简介

桥接(Bridge)模式的定义:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

定义来看,桥接模式遵循了里氏替换原则和依赖倒置原则,最终实现了开闭原则,对修改关闭,对扩展开放。

二 代码

2.1 开发代码

package bridge

import "fmt"

// 桥接模式分离抽象部分和实现部分。使得两部分独立扩展。

// 定义两种实现类型抽象定义,例如定义电脑接口和定义打印机接口

// 一个类型内部包含方法定义,

// 一个类型内部实现自身业务逻辑

// 客户端实例话对应对象,进行对象任意组合

// 电脑接口
type computer interface {
    print()
    setPrinter(printer)
}

// 打印机接口
type printer interface {
    printFile()
}

type epson struct {
}

func (e *epson) printFile()  {
    fmt.Println("printing by epson printer")
}

type hp struct {
}

func (p *hp) printFile()  {
    fmt.Println("printing by hp printer")
}



type Win struct {
    printer printer
}

func (w *Win) print()  {
    fmt.Println("print win")
    w.printer.printFile()
}

func (w *Win) setPrinter(p printer)  {
    w.printer = p
}

type Mac struct {
    printer printer
}

func (m *Mac) print()  {
    fmt.Println("print mac")
    m.printer.printFile()
}

func (m *Mac) setPrinter(p printer)  {
    m.printer = p
}

2.2 测试

package bridge

import (
    "fmt"
    "testing"
)

func TestBridge(t *testing.T)  {
    hpPrinter := &hp{}

    epsonPrinter := &epson{}

    m := Mac{}

    m.setPrinter(hpPrinter)
    m.print()
    m.setPrinter(epsonPrinter)
    m.print()

    fmt.Println("------")

    w := Win{}
    w.setPrinter(epsonPrinter)
    w.print()
    w.setPrinter(hpPrinter)
    w.print()
}

2.3 运行输出

=== RUN   TestBridge
print mac
printing by hp printer
print mac
printing by epson printer
------
print win
printing by epson printer
print win
printing by hp printer
--- PASS: TestBridge (0.00s)
PASS

三 应用场景

  • 如果你想要拆分或重组一个具有多重功能的庞杂类(例如能与多个数据库服务器进行交互的类),可以使用桥接模式。

  • 如果你希望在几个独立维度上扩展一个类, 可使用该模式。

  • 如果你需要在运行时切换不同实现方法, 可使用桥接模式。

四 特点

4.1 优点

  • 抽象与实现分离,扩展能力强
  • 符合开闭原则
  • 符合合成复用原则
  • 其实现细节对客户透明

4.2 缺点

  • 由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难度。

参考链接