橋接模式
是一種結構型設計模式, 可將一個大類或一系列緊密相關的類拆分為抽象和實現兩個獨立的層次結構, 從而能在開發時分別使用。
模型說明
-
抽象部分(Abstraction)提供高層控制邏輯,依賴于完成底層實際工作的實現對象。
-
實現部分(Implementation)為所有具體實現聲明通用接口。抽象部分僅能通過在這里聲明的方法與實現對象交互。
-
抽象部分可以列出和實現部分一樣的方法,但是抽象部分通常聲明一些復雜行為,這些行為依賴于多種由實現部分聲明的原語操作。
-
具體實現(Concrete Implementations)中包括特定于平臺的代碼。
-
精確抽象(Refined Abstraction)提供控制邏輯的變體。與其父類一樣,它們通過通用實現接口與不同的實現進行交互。
-
通常情況下,客戶端(Client)僅關心如何與抽象部分合作。但是,客戶端需要將抽象對象與一個實現對象連接起來。
優缺點
1.優點
- 你可以創建與平臺無關的類和程序。
- 客戶端代碼僅與高層抽象部分進行互動,不會接觸到平臺的詳細信息。
- *開閉原則:*你可以新增抽象部分和實現部分,且它們之間不會相互影響。
- *單一職責原則:*抽象部分專注于處理高層邏輯, 實現部分處理平臺細節。
2.缺點
- 對高內聚的類使用該模式可能會讓代碼更加復雜。
使用場景
- 如果你想要拆分或重組一個具有多重功能的龐雜類(例如能與多個數據庫服務器進行交互的類),可以使用橋接模式。
- 如果你希望在幾個獨立維度上擴展一個類,可使用該模式。
- 如果你需要在運行時切換不同實現方法,可使用橋接模式。
參考代碼
如果我們有一臺Mac和一臺Windows。還有兩臺打印機:愛普生和惠普。這兩臺電腦和打印機可能會任意組合使用。 客戶端不應去擔心如何將打印機連接至計算機的細節問題。
computer.go 抽象部分(高層控制)
package mainimport "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
}
priter.go 實現部分(底層實際工作)
package mainimport "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 客戶端
package mainimport "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()
}
output:
Print request for mac
Printing by a HP PrinterPrint request for mac
Printing by a EPSON PrinterPrint request for windows
Printing by a HP PrinterPrint request for windows
Printing by a EPSON Printer