GoLang橋接模式的實(shí)現(xiàn)示例
橋接模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,通過(guò)橋接模式可以將抽象部分和它的實(shí)現(xiàn)部分分離。這看著有點(diǎn)兒奇怪,接下來(lái)會(huì)作詳細(xì)說(shuō)明。
橋接模式建議將一個(gè)較大的類拆分成兩中角色。
- 抽象角色 - 抽象角色是一個(gè)接口。它的子類也被稱為修正抽象角色。抽象角色包含一個(gè)對(duì)實(shí)現(xiàn)角色的引用。
- 實(shí)現(xiàn)角色 - 實(shí)現(xiàn)角色也是一個(gè)接口。實(shí)現(xiàn)角色的子類被稱為具化實(shí)現(xiàn)角色。
這樣分層的優(yōu)勢(shì)在于在調(diào)用抽象角色的時(shí)候不需要考慮實(shí)現(xiàn)層的內(nèi)容。
舉個(gè)例子,假設(shè)我們手上有兩部筆記本:Mac本和Windows本;同時(shí)也有兩部打印機(jī):愛(ài)普生(Epson)打印機(jī)和惠普(Hp)打印機(jī)。我們希望筆記本和打印機(jī)能任意組合來(lái)完成工作,用戶只通過(guò)筆記本進(jìn)行操作而無(wú)需關(guān)心打印機(jī)是如何工作的。
這個(gè)例子中有2×2四種組合,但是不需要為此創(chuàng)建四個(gè)struct,而是創(chuàng)建兩層:
- 抽象層
- 實(shí)現(xiàn)層
看下下面的圖。在圖中可以看到抽象層(這里是computer)和實(shí)現(xiàn)層(這里是printer)通過(guò)抽象層中對(duì)實(shí)現(xiàn)層的引用來(lái)進(jìn)行交互,這個(gè)引用就是橋接模式所謂的橋梁。通過(guò)橋接模式,抽象層和引用層可以分別獨(dú)立實(shí)現(xiàn)而不互相影響。
注意圖中win和mac是如何嵌入printer的引用的:這里綁定的是printer接口,而非是priter的具體實(shí)現(xiàn)。這樣就可以在運(yùn)行時(shí)修改printer的值。如前面所說(shuō),printer引用在這里扮演了一個(gè)橋梁的角色,并實(shí)現(xiàn)了computer和printer的松耦合。
橋接模式的UML圖如下:
接下來(lái)是前面的例子的代碼。
抽象角色,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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang實(shí)現(xiàn)拓?fù)渑判?DFS算法版)
這篇文章主要介紹了Golang實(shí)現(xiàn)拓?fù)渑判?DFS算法版),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Go語(yǔ)言實(shí)戰(zhàn)之實(shí)現(xiàn)一個(gè)簡(jiǎn)單分布式系統(tǒng)
如今很多云原生系統(tǒng)、分布式系統(tǒng),例如?Kubernetes,都是用?Go?語(yǔ)言寫的,這是因?yàn)?Go?語(yǔ)言天然支持異步編程。本篇文章將介紹如何用?Go?語(yǔ)言編寫一個(gè)簡(jiǎn)單的分布式系統(tǒng),需要的小伙伴開業(yè)跟隨小編一起學(xué)習(xí)一下2022-10-10使用gin框架搭建簡(jiǎn)易服務(wù)的實(shí)現(xiàn)方法
go語(yǔ)言web框架挺多的,本文就介紹了一下如何使用gin框架搭建簡(jiǎn)易服務(wù)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12使用Golang的channel交叉打印兩個(gè)數(shù)組的操作
這篇文章主要介紹了使用Golang的channel交叉打印兩個(gè)數(shù)組的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04Go并發(fā)讀寫文件、分片寫、分片下載文件的實(shí)現(xiàn)示例
讀寫文件在很多項(xiàng)目中都可以用到,本文主要介紹了Go并發(fā)讀寫文件、分片寫、分片下載文件的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01詳解golang函數(shù)多返回值錯(cuò)誤處理與error類型
這篇文章主要為大家詳細(xì)介紹了golang中函數(shù)多返回值錯(cuò)誤處理與error類型的相關(guān)知識(shí),文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)吧2023-10-10