Golang設(shè)計(jì)模式中的橋接模式詳細(xì)講解
橋接模式
橋接是一種結(jié)構(gòu)型設(shè)計(jì)模式, 可將業(yè)務(wù)邏輯或一個(gè)大類拆分為不同的層次結(jié)構(gòu), 從而能獨(dú)立地進(jìn)行開(kāi)發(fā)。
層次結(jié)構(gòu)中的第一層 (通常稱為抽象部分) 將包含對(duì)第二層 (實(shí)現(xiàn)部分) 對(duì)象的引用。 抽象部分將能將一些 (有時(shí)是絕大部分) 對(duì)自己的調(diào)用委派給實(shí)現(xiàn)部分的對(duì)象。 所有的實(shí)現(xiàn)部分都有一個(gè)通用接口, 因此它們能在抽象部分內(nèi)部相互替換。
概念示例
假設(shè)你有兩臺(tái)電腦: 一臺(tái) Mac 和一臺(tái) Windows。 還有兩臺(tái)打印機(jī): 愛(ài)普生和惠普。 這兩臺(tái)電腦和打印機(jī)可能會(huì)任意組合使用。 客戶端不應(yīng)去擔(dān)心如何將打印機(jī)連接至計(jì)算機(jī)的細(xì)節(jié)問(wèn)題。
如果引入新的打印機(jī), 我們也不會(huì)希望代碼量成倍增長(zhǎng)。 所以, 我們創(chuàng)建了兩個(gè)層次結(jié)構(gòu), 而不是 2x2 組合的四個(gè)結(jié)構(gòu)體:
抽象層: 代表計(jì)算機(jī)
實(shí)施層: 代表打印機(jī)
這兩個(gè)層次可通過(guò)橋接進(jìn)行溝通, 其中抽象層 (計(jì)算機(jī)) 包含對(duì)于實(shí)施層 (打印機(jī)) 的引用。 抽象層和實(shí)施層均可獨(dú)立開(kāi)發(fā), 不會(huì)相互影響。
computer.go: 抽象
package main type Computer interface { Print() SetPrinter(Printer) }
mac.go: 精確抽象
package main 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 }
windows.go: 精確抽象
package main 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 }
printer.go: 實(shí)施
package main type Printer interface { PrintFile() }
epson.go: 具體實(shí)施
package main import "fmt" type Epson struct { } func (p *Epson) PrintFile() { fmt.Println("Printing by a EPSON Printer") }
hp.go: 具體實(shí)施
package main import "fmt" type Hp struct { } func (p *Hp) PrintFile() { fmt.Println("Printing by a HP Printer") }
main.go: 客戶端代碼
package main import "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.txt: 執(zhí)行結(jié)果
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
到此這篇關(guān)于Golang設(shè)計(jì)模式中的橋接模式詳細(xì)講解的文章就介紹到這了,更多相關(guān)Go橋接模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言使用時(shí)會(huì)遇到的錯(cuò)誤及解決方法詳解
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言使用時(shí)常常會(huì)遇到的一些錯(cuò)誤及解決方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-07-07詳解Go語(yǔ)言中Goroutine退出機(jī)制的原理及使用
goroutine是Go語(yǔ)言提供的語(yǔ)言級(jí)別的輕量級(jí)線程,在我們需要使用并發(fā)時(shí),我們只需要通過(guò)?go?關(guān)鍵字來(lái)開(kāi)啟?goroutine?即可。本文就來(lái)詳細(xì)講講Goroutine退出機(jī)制的原理及使用,感興趣的可以了解一下2022-07-07go引入自建包名報(bào)錯(cuò):package?XXX?is?not?in?std解決辦法
這篇文章主要給大家介紹了go引入自建包名報(bào)錯(cuò):package?XXX?is?not?in?std的解決辦法,這是在寫(xiě)測(cè)試引入包名的時(shí)候遇到的錯(cuò)誤提示,文中將解決辦法介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12Golang標(biāo)準(zhǔn)庫(kù)unsafe源碼解讀
這篇文章主要為大家介紹了Golang標(biāo)準(zhǔn)庫(kù)unsafe源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Go使用XORM操作MySQL的陷阱盤(pán)點(diǎn)分析
在?Go?語(yǔ)言開(kāi)發(fā)中,大家為了方便,通常會(huì)選擇使用?ORM?操作數(shù)據(jù)庫(kù),比如使用?XORM?或?GORM?操作?MySQL,本文我們來(lái)介紹一下使用?XORM[3]?操作?MySQL?可能會(huì)遇到的陷阱2023-11-11