Golang設計模式中的橋接模式詳細講解
橋接模式
橋接是一種結構型設計模式, 可將業(yè)務邏輯或一個大類拆分為不同的層次結構, 從而能獨立地進行開發(fā)。
層次結構中的第一層 (通常稱為抽象部分) 將包含對第二層 (實現(xiàn)部分) 對象的引用。 抽象部分將能將一些 (有時是絕大部分) 對自己的調用委派給實現(xiàn)部分的對象。 所有的實現(xiàn)部分都有一個通用接口, 因此它們能在抽象部分內部相互替換。

概念示例
假設你有兩臺電腦: 一臺 Mac 和一臺 Windows。 還有兩臺打印機: 愛普生和惠普。 這兩臺電腦和打印機可能會任意組合使用。 客戶端不應去擔心如何將打印機連接至計算機的細節(jié)問題。
如果引入新的打印機, 我們也不會希望代碼量成倍增長。 所以, 我們創(chuàng)建了兩個層次結構, 而不是 2x2 組合的四個結構體:
抽象層: 代表計算機
實施層: 代表打印機
這兩個層次可通過橋接進行溝通, 其中抽象層 (計算機) 包含對于實施層 (打印機) 的引用。 抽象層和實施層均可獨立開發(fā), 不會相互影響。
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: 實施
package main
type Printer interface {
PrintFile()
}
epson.go: 具體實施
package main
import "fmt"
type Epson struct {
}
func (p *Epson) PrintFile() {
fmt.Println("Printing by a EPSON Printer")
}
hp.go: 具體實施
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í)行結果
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
到此這篇關于Golang設計模式中的橋接模式詳細講解的文章就介紹到這了,更多相關Go橋接模式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
go引入自建包名報錯:package?XXX?is?not?in?std解決辦法
這篇文章主要給大家介紹了go引入自建包名報錯:package?XXX?is?not?in?std的解決辦法,這是在寫測試引入包名的時候遇到的錯誤提示,文中將解決辦法介紹的非常詳細,需要的朋友可以參考下2023-12-12

