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

使用go實(shí)現(xiàn)適配器模式

 更新時(shí)間:2021年11月15日 08:41:31   作者:Rick.lz  
這篇文章主要介紹了使用go實(shí)現(xiàn)適配器模式,這個(gè)模式就是用來(lái)做適配的,它將不兼容的接口轉(zhuǎn)換為可兼容的接口,讓原本由于接口不兼容而不能一起工作的類(lèi)可以一起工作,需要的朋友可以參考下

適配器模式

定義

適配器模式的英文翻譯是Adapter Design Pattern。顧名思義,這個(gè)模式就是用來(lái)做適配的,它將不兼容的接口轉(zhuǎn)換為可兼容的接口,讓原本由于接口不兼容而不能一起工作的類(lèi)可以一起工作。

舉個(gè)栗子:

現(xiàn)在比較新款的電腦都有USB-C接口,但是我們目前的鼠標(biāo)鍵盤(pán)的接口都是傳統(tǒng)的USB接口,所以是不能使用的,這時(shí)候我們會(huì)買(mǎi)個(gè)轉(zhuǎn)接口來(lái)進(jìn)行接口的轉(zhuǎn)接,那么這個(gè)轉(zhuǎn)接口在設(shè)計(jì)模式中就是適配器。

代碼實(shí)現(xiàn)

// 基礎(chǔ)的播放功能
type MediaPlayer interface {
	play(audioType string, fileName string)
}

// 不同的播放器平臺(tái)
type AdvancedMediaPlayer interface {
	playVlc(fileName string)
	playMp4(fileName string)
}

// VlcPlayers
type VlcPlayers struct {
}

func (v *VlcPlayers) playVlc(fileName string) {
	fmt.Println("正在播放" + fileName)
}

func (v *VlcPlayers) playMp4(fileName string) {
	fmt.Println("格式不支持")
}

// Mp4Player
type Mp4Player struct {
}

func (m *Mp4Player) playVlc(fileName string) {
	fmt.Println("格式不支持")
}

func (m *Mp4Player) playMp4(fileName string) {
	fmt.Println("正在播放" + fileName)
}

// 適配器
type MediaAdapter struct {
	MusicPlayer AdvancedMediaPlayer
}

func NewMediaAdapter(audioType string) *MediaAdapter {
	var mediaAdapter MediaAdapter
	switch audioType {
	case "vlc":
		mediaAdapter.MusicPlayer = &VlcPlayers{}
	case "mp4":
		mediaAdapter.MusicPlayer = &Mp4Player{}
	default:
		panic("不支持的類(lèi)型")
	}
	return &mediaAdapter
}
func (m *MediaAdapter) play(audioType string, fileName string) {
	switch audioType {
	case "vlc":
		m.MusicPlayer.playVlc(fileName)
	case "mp4":
		m.MusicPlayer.playMp4(fileName)

	}
}

// AudioPlayer 音頻播放器類(lèi)
type AudioPlayer struct {
	mediaAdapter *MediaAdapter
}

// Play 播放音頻
func (auPlayer *AudioPlayer) Play(audioType, fileName string) {
	if audioType == "mp3" {
		fmt.Println("正在播放" + fileName)
		return
	}
	auPlayer.mediaAdapter = NewMediaAdapter(audioType)
	auPlayer.mediaAdapter.play(audioType, fileName)
}

測(cè)試文件

func TestPlayer(t *testing.T) {
	ad := AudioPlayer{}
	ad.Play("mp4", "荷塘月色")
	ad.Play("vlc", "小蘋(píng)果")
	ad.Play("mp3", "天空之城")
}

這里做個(gè)簡(jiǎn)單的分析

1、我們有一個(gè) AudioPlayer ,但是只能播放 mp3;

2、我們希望 AudioPlayer 也可以播放 mp3 和 vlc;

3、引入了一個(gè) MediaAdapter ,通過(guò)適配器來(lái)處理不支持的功能,對(duì)于 AudioPlayer 來(lái)講,它只用需要調(diào)用 MediaAdapter 就能實(shí)現(xiàn)各種播放格式音頻的播放;

4、MediaAdapter 對(duì)各種格式進(jìn)行了包裝,不同的格式音頻,可以有用相同的調(diào)用方法。

放一張結(jié)構(gòu)圖

優(yōu)點(diǎn)

1、可以讓任何兩個(gè)沒(méi)有關(guān)聯(lián)的類(lèi)一起運(yùn)行。

2、提高了類(lèi)的復(fù)用。

3、增加了類(lèi)的透明度。

4、靈活性好。

缺點(diǎn)

過(guò)多地使用適配器,會(huì)讓系統(tǒng)非常零亂,不易整體進(jìn)行把握

一般來(lái)說(shuō),適配器模式可以看作一種“補(bǔ)償模式”,用來(lái)補(bǔ)救設(shè)計(jì)上的缺陷。應(yīng)用這種模式算是“無(wú)奈之舉”,如果在設(shè)計(jì)初期,我們就能協(xié)調(diào)規(guī)避接口不兼容的問(wèn)題,那這種模式就沒(méi)有應(yīng)用的機(jī)會(huì)了。

如果大量的使用這種模式,可能就是我們的前期的設(shè)計(jì)有很大的問(wèn)題,就需要考慮重構(gòu)了

適用范圍

1、封裝有缺陷的接口設(shè)計(jì)

2、統(tǒng)一多個(gè)類(lèi)的接口設(shè)計(jì)

3、替換依賴(lài)的外部系統(tǒng)

4、兼容老版本接口

5、適配不同格式的數(shù)據(jù)

代理、橋接、裝飾器、適配器4種設(shè)計(jì)模式的區(qū)別

代理模式:代理模式在不改變?cè)碱?lèi)接口的條件下,為原始類(lèi)定義一個(gè)代理類(lèi),主要目的是控制訪(fǎng)問(wèn),而非加強(qiáng)功能,這是它跟裝飾器模式最大的不同。

橋接模式:橋接模式的目的是將接口部分和實(shí)現(xiàn)部分分離,從而讓它們可以較為容易、也相對(duì)獨(dú)立地加以改變。

裝飾器模式:裝飾者模式在不改變?cè)碱?lèi)接口的情況下,對(duì)原始類(lèi)功能進(jìn)行增強(qiáng),并且支持多個(gè)裝飾器的嵌套使用。

適配器模式:適配器模式是一種事后的補(bǔ)救策略。適配器提供跟原始類(lèi)不同的接口,而代理模式、裝飾器模式提供的都是跟原始類(lèi)相同的接口。

參考

【文中代碼】https://github.com/boilingfrog/design-pattern-learning/tree/master/適配器模式
【大話(huà)設(shè)計(jì)模式】https://book.douban.com/subject/2334288/
【極客時(shí)間】https://time.geekbang.org/column/intro/100039001
【菜鳥(niǎo)教程】https://www.runoob.com/design-pattern/adapter-pattern.html
【詩(shī)適配器模式】https://boilingfrog.github.io/2021/11/14/使用go實(shí)現(xiàn)適配器模式/

到此這篇關(guān)于使用go實(shí)現(xiàn)適配器模式的文章就介紹到這了,更多相關(guān)go適配器模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go項(xiàng)目分層下的最佳error處理方式分享

    Go項(xiàng)目分層下的最佳error處理方式分享

    這篇文章主要來(lái)和大家一起探討?Go?項(xiàng)目分層下的最佳?error?處理方式,準(zhǔn)備好了嗎?準(zhǔn)備一杯你最喜歡的飲料或茶,隨著本文一探究竟吧
    2023-06-06
  • Go編寫(xiě)定時(shí)器與定時(shí)任務(wù)詳解(附第三方庫(kù)gocron用法)

    Go編寫(xiě)定時(shí)器與定時(shí)任務(wù)詳解(附第三方庫(kù)gocron用法)

    當(dāng)需要每天執(zhí)行定時(shí)任務(wù)的時(shí)候就需要定時(shí)器來(lái)處理了,周期任務(wù),倒計(jì)時(shí)任務(wù),定點(diǎn)任務(wù)等,下面這篇文章主要給大家介紹了關(guān)于Go編寫(xiě)定時(shí)器與定時(shí)任務(wù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • Golang使用Redis與連接池方式

    Golang使用Redis與連接池方式

    這篇文章主要介紹了Golang使用Redis與連接池方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Go語(yǔ)言dolphinscheduler任務(wù)調(diào)度處理

    Go語(yǔ)言dolphinscheduler任務(wù)調(diào)度處理

    這篇文章主要為大家介紹了Go語(yǔ)言dolphinscheduler任務(wù)調(diào)度處理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go基礎(chǔ)教程系列之WaitGroup用法實(shí)例詳解

    Go基礎(chǔ)教程系列之WaitGroup用法實(shí)例詳解

    這篇文章主要介紹了Go基礎(chǔ)教程系列之WaitGroup用法實(shí)例詳解,需要的朋友可以參考下
    2022-04-04
  • win10下安裝Go和Goland的詳細(xì)教程

    win10下安裝Go和Goland的詳細(xì)教程

    這篇文章主要介紹了win10下安裝Go和Goland的詳細(xì)教程,本文給大家提到了go和golang之間的區(qū)別,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Golang使用第三方包viper讀取yaml配置信息操作

    Golang使用第三方包viper讀取yaml配置信息操作

    這篇文章主要介紹了Golang使用第三方包viper讀取yaml配置信息操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • golang flag簡(jiǎn)單用法

    golang flag簡(jiǎn)單用法

    本篇文章介紹了golang flag包的一個(gè)簡(jiǎn)單的用法,希望通過(guò)一個(gè)簡(jiǎn)單的實(shí)例,能讓大家了解它的用法,從中獲得啟發(fā)
    2018-09-09
  • go語(yǔ)言標(biāo)準(zhǔn)庫(kù)fmt包的一鍵入門(mén)

    go語(yǔ)言標(biāo)準(zhǔn)庫(kù)fmt包的一鍵入門(mén)

    這篇文章主要為大家介紹了go語(yǔ)言標(biāo)準(zhǔn)庫(kù)fmt包的一鍵入門(mén)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • GO語(yǔ)言實(shí)現(xiàn)日志切割的示例詳解

    GO語(yǔ)言實(shí)現(xiàn)日志切割的示例詳解

    日志記錄對(duì)程序排查問(wèn)題比較關(guān)鍵,所以本文將選擇Logrus和lumberjack兩個(gè)庫(kù)進(jìn)行日志切割以及記錄調(diào)用源,感興趣的小伙伴可以了解一下
    2023-07-07

最新評(píng)論

江油市| 溧水县| 彭州市| 通化县| 建湖县| 德江县| 郯城县| 黔东| 甘肃省| 兴安盟| 梁平县| 朝阳县| 河池市| 尼木县| 望谟县| 南充市| 濮阳县| 无锡市| 咸丰县| 六盘水市| 武强县| 通道| 佛山市| 刚察县| 仪陇县| 阿图什市| 拉孜县| 樟树市| 铜梁县| 彰化县| 大荔县| 南部县| 长沙市| 灌南县| 成武县| 鹤峰县| 苍山县| 临安市| 长岛县| 丰台区| 临湘市|