欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

適配器模式

定義

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

舉個栗子:

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

代碼實現(xiàn)

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

// 不同的播放器平臺
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("不支持的類型")
	}
	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 音頻播放器類
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)
}

測試文件

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

這里做個簡單的分析

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

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

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

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

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

優(yōu)點

1、可以讓任何兩個沒有關(guān)聯(lián)的類一起運行。

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

3、增加了類的透明度。

4、靈活性好。

缺點

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

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

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

適用范圍

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

2、統(tǒng)一多個類的接口設(shè)計

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

4、兼容老版本接口

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

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

代理模式:代理模式在不改變原始類接口的條件下,為原始類定義一個代理類,主要目的是控制訪問,而非加強功能,這是它跟裝飾器模式最大的不同。

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

裝飾器模式:裝飾者模式在不改變原始類接口的情況下,對原始類功能進行增強,并且支持多個裝飾器的嵌套使用。

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

參考

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

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

相關(guān)文章

  • Go?gRPC服務(wù)proto數(shù)據(jù)驗證進階教程

    Go?gRPC服務(wù)proto數(shù)據(jù)驗證進階教程

    這篇文章主要為大家介紹了Go?gRPC服務(wù)proto數(shù)據(jù)驗證進階教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • golang中實現(xiàn)graphql請求的方法

    golang中實現(xiàn)graphql請求的方法

    這篇文章主要介紹了如何在golang中實現(xiàn)graphql請求,在本文中,我們介紹了如何使用gqlgen來構(gòu)建GraphQL服務(wù),需要的朋友可以參考下
    2023-04-04
  • go語言中GOPATH GOROOT的作用和設(shè)置方式

    go語言中GOPATH GOROOT的作用和設(shè)置方式

    這篇文章主要介紹了go語言中GOPATH GOROOT的作用和設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • golang修改結(jié)構(gòu)體中的切片值方法

    golang修改結(jié)構(gòu)體中的切片值方法

    這篇文章主要介紹了golang修改結(jié)構(gòu)體中的切片值方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Golang中的godoc使用簡介(推薦)

    Golang中的godoc使用簡介(推薦)

    Godoc是go語言的文檔化工具,類似于文檔化工具godoc,類似于Python的Docstring和Java的Javadoc,這篇文章主要介紹了Golang中的godoc使用簡介,需要的朋友可以參考下
    2022-10-10
  • 基于go+vue實現(xiàn)的golang每日新聞數(shù)據(jù)瀏覽與檢索平臺(推薦)

    基于go+vue實現(xiàn)的golang每日新聞數(shù)據(jù)瀏覽與檢索平臺(推薦)

    gonews是基于 go+vue 實現(xiàn)的golang每日新聞瀏覽與檢索平臺,本文通過實例代碼給大家講解,介紹的非常詳細,具有參考借鑒價值,需要的朋友參考下吧
    2018-01-01
  • 模塊一 GO語言基礎(chǔ)知識-庫源碼文件

    模塊一 GO語言基礎(chǔ)知識-庫源碼文件

    這篇文章主要介紹了模塊一 GO語言基礎(chǔ)知識-庫源碼文件,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Go語言生成隨機數(shù)的方法

    Go語言生成隨機數(shù)的方法

    這篇文章主要介紹了Go語言生成隨機數(shù)的方法,實例分析了Go語言生成隨機數(shù)的原理與實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • 淺析Go中序列化與反序列化的基本使用

    淺析Go中序列化與反序列化的基本使用

    序列化是指將對象轉(zhuǎn)換成字節(jié)流,從而存儲對象或?qū)ο髠鬏數(shù)絻?nèi)存、數(shù)據(jù)庫或文件的過程,反向過程稱為“反序列化”。本文主要介紹了Go中序列化與反序列化的基本使用,需要的可以參考一下
    2023-04-04
  • go使用errors.Wrapf()代替log.Error()方法示例

    go使用errors.Wrapf()代替log.Error()方法示例

    這篇文章主要為大家介紹了go使用errors.Wrapf()代替log.Error()的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08

最新評論