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

注意圖中win和mac是如何嵌入printer的引用的:這里綁定的是printer接口,而非是priter的具體實現(xiàn)。這樣就可以在運行時修改printer的值。如前面所說,printer引用在這里扮演了一個橋梁的角色,并實現(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
}實現(xiàn)角色,printer.go
type printer interface {
printFile()
}具體實現(xiàn)角色1,epson.go
import "fmt"
type epson struct {
}
func (p *epson) printFile() {
fmt.Println("Printing by a EPSON Printer")
}具體實現(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解決的一種思路,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧2018-08-08
Golang中的[]byte與16進制(String)之間的轉(zhuǎn)換方式
這篇文章主要介紹了Golang中的[]byte與16進制(String)之間的轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11
GO接收GET/POST參數(shù)及發(fā)送GET/POST請求的實例詳解
這篇文章主要介紹了GO接收GET/POST參數(shù)及發(fā)送GET/POST請求,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12

