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

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

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

橋接模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,通過(guò)橋接模式可以將抽象部分和它的實(shí)現(xiàn)部分分離。這看著有點(diǎn)兒奇怪,接下來(lái)會(huì)作詳細(xì)說(shuō)明。

橋接模式建議將一個(gè)較大的類(lèi)拆分成兩中角色。

  • 抽象角色 - 抽象角色是一個(gè)接口。它的子類(lèi)也被稱為修正抽象角色。抽象角色包含一個(gè)對(duì)實(shí)現(xiàn)角色的引用。
  • 實(shí)現(xiàn)角色 - 實(shí)現(xiàn)角色也是一個(gè)接口。實(shí)現(xiàn)角色的子類(lèi)被稱為具化實(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)文章

  • go web 處理表單的輸入的說(shuō)明

    go web 處理表單的輸入的說(shuō)明

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

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

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

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

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

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

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

    Golang學(xué)習(xí)之反射機(jī)制的用法詳解

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

    golang zap日志庫(kù)的具體使用

    本文主要介紹了golang zap日志庫(kù)的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11
  • 解決golang http重定向失效的問(wèn)題

    解決golang http重定向失效的問(wèn)題

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

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

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

    GoLang基礎(chǔ)學(xué)習(xí)之go?test測(cè)試

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

    Golang中errgroup的常見(jiàn)誤用詳解

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

最新評(píng)論

武穴市| 辛集市| 万山特区| 陆丰市| 益阳市| 贵南县| 隆回县| 湖口县| 天全县| 福海县| 普陀区| 青浦区| 武义县| 启东市| 青冈县| 桑日县| 裕民县| 西乌| 阿拉尔市| 伊川县| 新田县| 安达市| 磐石市| 呈贡县| 龙游县| 中卫市| 通许县| 通州区| 五华县| 招远市| 聂拉木县| 七台河市| 黎川县| 齐齐哈尔市| 福安市| 开江县| 陆河县| 灯塔市| 林周县| 绵竹市| 温泉县|