GoLang橋接模式的實(shí)現(xiàn)示例
橋接模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,通過橋接模式可以將抽象部分和它的實(shí)現(xiàn)部分分離。這看著有點(diǎn)兒奇怪,接下來會作詳細(xì)說明。
橋接模式建議將一個(gè)較大的類拆分成兩中角色。
- 抽象角色 - 抽象角色是一個(gè)接口。它的子類也被稱為修正抽象角色。抽象角色包含一個(gè)對實(shí)現(xiàn)角色的引用。
- 實(shí)現(xiàn)角色 - 實(shí)現(xiàn)角色也是一個(gè)接口。實(shí)現(xiàn)角色的子類被稱為具化實(shí)現(xiàn)角色。
這樣分層的優(yōu)勢在于在調(diào)用抽象角色的時(shí)候不需要考慮實(shí)現(xiàn)層的內(nèi)容。
舉個(gè)例子,假設(shè)我們手上有兩部筆記本:Mac本和Windows本;同時(shí)也有兩部打印機(jī):愛普生(Epson)打印機(jī)和惠普(Hp)打印機(jī)。我們希望筆記本和打印機(jī)能任意組合來完成工作,用戶只通過筆記本進(jìn)行操作而無需關(guān)心打印機(jī)是如何工作的。
這個(gè)例子中有2×2四種組合,但是不需要為此創(chuàng)建四個(gè)struct,而是創(chuàng)建兩層:
- 抽象層
- 實(shí)現(xiàn)層
看下下面的圖。在圖中可以看到抽象層(這里是computer)和實(shí)現(xiàn)層(這里是printer)通過抽象層中對實(shí)現(xiàn)層的引用來進(jìn)行交互,這個(gè)引用就是橋接模式所謂的橋梁。通過橋接模式,抽象層和引用層可以分別獨(dú)立實(shí)現(xiàn)而不互相影響。

注意圖中win和mac是如何嵌入printer的引用的:這里綁定的是printer接口,而非是priter的具體實(shí)現(xiàn)。這樣就可以在運(yùn)行時(shí)修改printer的值。如前面所說,printer引用在這里扮演了一個(gè)橋梁的角色,并實(shí)現(xiàn)了computer和printer的松耦合。
橋接模式的UML圖如下:

接下來是前面的例子的代碼。
抽象角色,computer.go:
type computer interface {
print()
setPrinter(printer)
}修正抽象角色1,win.go
import "fmt"
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
}修正抽象角色2,mac.go
import "fmt"
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
}實(shí)現(xiàn)角色,printer.go
type printer interface {
printFile()
}具體實(shí)現(xiàn)角色1,epson.go
import "fmt"
type epson struct {
}
func (p *epson) printFile() {
fmt.Println("Printing by a EPSON Printer")
}具體實(shí)現(xiàn)角色2,hp.go
type hp struct {
}
func (p *hp) printFile() {
fmt.Println("Printing by a HP Printer")
}Client, 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()
}輸出內(nèi)容:
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
代碼已上傳至GitHub:zhyea / go-patterns / bridge-pattern
到此這篇關(guān)于GoLang橋接模式的文章就介紹到這了,更多相關(guān)GoLang 橋接模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang中import cycle not allowed解決的一種思路
這篇文章主要給大家介紹了關(guān)于golang中import cycle not allowed解決的一種思路,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08
Golang中的[]byte與16進(jìn)制(String)之間的轉(zhuǎn)換方式
這篇文章主要介紹了Golang中的[]byte與16進(jìn)制(String)之間的轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Golang學(xué)習(xí)之反射機(jī)制的用法詳解
反射的本質(zhì)就是在程序運(yùn)行的時(shí)候,獲取對象的類型信息和內(nèi)存結(jié)語構(gòu),反射是把雙刃劍,功能強(qiáng)大但可讀性差。本文將詳細(xì)講講Golang中的反射機(jī)制,感興趣的可以了解一下2022-06-06
GO接收GET/POST參數(shù)及發(fā)送GET/POST請求的實(shí)例詳解
這篇文章主要介紹了GO接收GET/POST參數(shù)及發(fā)送GET/POST請求,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
GoLang基礎(chǔ)學(xué)習(xí)之go?test測試
相信每位編程開發(fā)者們應(yīng)該都知道,Golang作為一門標(biāo)榜工程化的語言,提供了非常簡便、實(shí)用的編寫單元測試的能力,下面這篇文章主要給大家介紹了關(guān)于GoLang基礎(chǔ)學(xué)習(xí)之go?test測試的相關(guān)資料,需要的朋友可以參考下2022-08-08

