最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

GoLang橋接模式的實現(xiàn)示例

 更新時間:2022年01月10日 10:26:55   作者:robin·張  
橋接模式是一種結(jié)構(gòu)型設(shè)計模式,通過橋接模式可以將抽象部分和它的實現(xiàn)部分分離,本文主要介紹了GoLang橋接模式,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

橋接模式是一種結(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)文章

  • go web 處理表單的輸入的說明

    go web 處理表單的輸入的說明

    今天給大家普及go表單輸入方面的知識點,整體代碼分為前端頁面和后端處理方法,通過代碼給大家介紹的很詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-06-06
  • golang中import cycle not allowed解決的一種思路

    golang中import cycle not allowed解決的一種思路

    這篇文章主要給大家介紹了關(guān)于golang中import cycle not allowed解決的一種思路,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧
    2018-08-08
  • 詳解如何在Go語言中調(diào)用C源代碼

    詳解如何在Go語言中調(diào)用C源代碼

    這篇文章主要為大家詳細介紹了如何在Go語言中調(diào)用C語言源代碼,文中的示例代碼講解詳細,對我們學習或工作有一定的幫助,需要的可以參考一下
    2022-05-05
  • Golang中的[]byte與16進制(String)之間的轉(zhuǎn)換方式

    Golang中的[]byte與16進制(String)之間的轉(zhuǎn)換方式

    這篇文章主要介紹了Golang中的[]byte與16進制(String)之間的轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Golang學習之反射機制的用法詳解

    Golang學習之反射機制的用法詳解

    反射的本質(zhì)就是在程序運行的時候,獲取對象的類型信息和內(nèi)存結(jié)語構(gòu),反射是把雙刃劍,功能強大但可讀性差。本文將詳細講講Golang中的反射機制,感興趣的可以了解一下
    2022-06-06
  • golang zap日志庫的具體使用

    golang zap日志庫的具體使用

    本文主要介紹了golang zap日志庫的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-11-11
  • 解決golang http重定向失效的問題

    解決golang http重定向失效的問題

    這篇文章主要介紹了解決golang http重定向失效的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • GO接收GET/POST參數(shù)及發(fā)送GET/POST請求的實例詳解

    GO接收GET/POST參數(shù)及發(fā)送GET/POST請求的實例詳解

    這篇文章主要介紹了GO接收GET/POST參數(shù)及發(fā)送GET/POST請求,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • GoLang基礎(chǔ)學習之go?test測試

    GoLang基礎(chǔ)學習之go?test測試

    相信每位編程開發(fā)者們應(yīng)該都知道,Golang作為一門標榜工程化的語言,提供了非常簡便、實用的編寫單元測試的能力,下面這篇文章主要給大家介紹了關(guān)于GoLang基礎(chǔ)學習之go?test測試的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • Golang中errgroup的常見誤用詳解

    Golang中errgroup的常見誤用詳解

    errgroup和sync.WaitGroup類似,都可以發(fā)起執(zhí)行并等待一組協(xié)程直到所有協(xié)程運行結(jié)束,本文主要為大家整理了一些errgroup的常見誤用,有需要的可以參考下
    2024-01-01

最新評論

宁津县| 横峰县| 延寿县| 上栗县| 永川市| 沙雅县| 城市| 铁力市| 荥阳市| 龙岩市| 旌德县| 松溪县| 镇沅| 黄平县| 萍乡市| 阿图什市| 麦盖提县| 东阳市| 于田县| 灵川县| 张家港市| 江孜县| 桂东县| 闸北区| 华蓥市| 昌黎县| 英山县| 三穗县| 青神县| 隆林| 北票市| 洪江市| 博白县| 河北区| 化隆| 咸阳市| 满城县| 葫芦岛市| 万山特区| 时尚| 松桃|