跳至主要內容

桥接模式

离心原创大约 2 分钟tutorialgolangdesign-patterns

桥接模式是一种结构型设计模式,它能将抽象部分与实现部分分离开来,使得两者可以独立变化。桥接模式建立一个桥接结构去搭起抽象部分和实现部分,从而可以保持各部分的独立性和优势。

桥接模式

桥接模式的主要作用是:

桥接模式能将抽象部分和实现部分分离,它们可以独立地变化。

消除永久绑定关系,提高系统的可扩展性,客户端不需要重新编译代码就可以扩展新的实现类。

桥接模式提高了抽象和实现的独立性,有利于系统的分层设计。

桥接模式符合开闭原则,在抽象和实现中任意一方改变,都不影响另一方。

实现

例如我们现在有两台电脑,一台Mac和一台Windows,另外还有两台打印机,任意电脑都可使用两台打印机,所以这四台机器的排列组合值是4个。

抽象层是计算机,实施层是打印机。

这两个层次可以通过桥接进行沟通,其中抽象层(计算机)包含对实施层(打印机)的引用。抽象层和实施层均可独立开发不受影响。

// computer.go
type Computer interface {
    Print()
    SetPrinter(Printer)
}
// mac.go
type Mac struct {
    printer Printer
}

func (m *Mac) Print() {
    fmt.Println("Print request for mac")
    m.printer.PrintFile()
}

func (m *Mac) SetPrinter(p Printer) {
    m.printer = p
}
// windows.go
type Windows struct {
    printer Printer
}

func (w *Windows) Print() {
    fmt.Println("Print request for windows")
    w.printer.PrintFile()
}

func (w *Windows) SetPrinter(p Printer) {
    w.printer = p
}
// printer.go
type Printer interface {
    PrintFile()
}
// epson.go
type Epson struct {
}

func (p *Epson) PrintFile() {
    fmt.Println("Printing by a EPSON Printer")
}
// hp.go
type Hp struct {
}

func (p *Hp) PrintFile() {
    fmt.Println("Printing by a HP Printer")
}
// main.go
package main

import "fmt"

func main() {

    hpPrinter := &Hp{}
    epsonPrinter := &Epson{}

    macComputer := &Mac{}

    macComputer.SetPrinter(hpPrinter)
    macComputer.Print()
    fmt.Println()

    macComputer.SetPrinter(epsonPrinter)
    macComputer.Print()
    fmt.Println()

    winComputer := &Windows{}

    winComputer.SetPrinter(hpPrinter)
    winComputer.Print()
    fmt.Println()

    winComputer.SetPrinter(epsonPrinter)
    winComputer.Print()
    fmt.Println()
}

结果:

Print request for mac
Printing by a HP Printer

Print request for mac
Printing by a EPSON Printer

Print request for windows
Printing by a HP Printer

Print request for windows

总结

桥接器作为结构型设计模式,可以将业务逻辑拆分为不同的结构层次,从而独立开发,抽象层一般可以将对自己的调用委派给实现的对象。所有的实现部分都有一个通用接口, 因此它们能在抽象部分内部相互替换。