结构型:五. 桥接模式

桥接模式是什么

桥接模式:桥接是一种结构型设计模式, 可将业务逻辑或一个大类拆分为不同的层次结构, 从而能独立地进行开发。

为什么用桥接模式

对于两个独立变化的维度,使用桥接模式再适合不过了.

桥接模式怎么实现

这里是将computer和printer分成两层,用接口的方式把强耦合转化为弱耦合。这两个层次可通过桥接进行沟通, 其中抽象层 (computer) 包含对于实施层 (printer) 的引用。 抽象层和实施层均可独立开发, 不会相互影响。

computer.go

package bridge

import "fmt"

type computer interface {
    print()
    setPrinter(printer)
}

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
}

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

package bridge

import "fmt"

type printer interface {
    printFile()
}

type epson struct {
}

func (p *epson) printFile() {
    fmt.Println("Printing by a EPSON Printer")
}

type hp struct {
}

func (p *hp) printFile() {
    fmt.Println("Printing by a HP Printer")
}

main.go 客户端代码

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
//Printing by a EPSON Printer

优点

  1. 桥接模式使层次结构更清晰,系统更具扩展性。
  2. 桥接模式使系统更灵活,实现了抽象化与实现化的脱耦。他们两个互相独立,不会影响到对方。

缺点

  1. 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
  2. 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性
posted @ 2022-03-31 21:27  EthanWell  阅读(152)  评论(0编辑  收藏  举报