適配器模式
定義
適配器模式的英文翻譯是Adapter Design Pattern。顧名思義,這個(gè)模式就是用來做適配的,它將不兼容的接口轉(zhuǎn)換為可兼容的接口,讓原本由于接口不兼容而不能一起工作的類可以一起工作。
舉個(gè)栗子:
現(xiàn)在比較新款的電腦都有USB-C接口,但是我們目前的鼠標(biāo)鍵盤的接口都是傳統(tǒng)的USB接口,所以是不能使用的,這時(shí)候我們會(huì)買個(gè)轉(zhuǎn)接口來進(jìn)行接口的轉(zhuǎn)接,那么這個(gè)轉(zhuǎn)接口在設(shè)計(jì)模式中就是適配器。
代碼實(shí)現(xiàn)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
// 基礎(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("不支持的類型") } 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) } |
測(cè)試文件
1
2
3
4
5
6
|
func TestPlayer(t *testing.T) { ad := AudioPlayer{} ad.Play("mp4", "荷塘月色") ad.Play("vlc", "小蘋果") ad.Play("mp3", "天空之城") } |
這里做個(gè)簡(jiǎn)單的分析
1、我們有一個(gè) AudioPlayer ,但是只能播放 mp3;
2、我們希望 AudioPlayer 也可以播放 mp3 和 vlc;
3、引入了一個(gè) MediaAdapter ,通過適配器來處理不支持的功能,對(duì)于 AudioPlayer 來講,它只用需要調(diào)用 MediaAdapter 就能實(shí)現(xiàn)各種播放格式音頻的播放;
4、MediaAdapter 對(duì)各種格式進(jìn)行了包裝,不同的格式音頻,可以有用相同的調(diào)用方法。
放一張結(jié)構(gòu)圖
優(yōu)點(diǎn)
1、可以讓任何兩個(gè)沒有關(guān)聯(lián)的類一起運(yùn)行。
2、提高了類的復(fù)用。
3、增加了類的透明度。
4、靈活性好。
缺點(diǎn)
過多地使用適配器,會(huì)讓系統(tǒng)非常零亂,不易整體進(jìn)行把握
一般來說,適配器模式可以看作一種“補(bǔ)償模式”,用來補(bǔ)救設(shè)計(jì)上的缺陷。應(yīng)用這種模式算是“無奈之舉”,如果在設(shè)計(jì)初期,我們就能協(xié)調(diào)規(guī)避接口不兼容的問題,那這種模式就沒有應(yīng)用的機(jī)會(huì)了。
如果大量的使用這種模式,可能就是我們的前期的設(shè)計(jì)有很大的問題,就需要考慮重構(gòu)了
適用范圍
1、封裝有缺陷的接口設(shè)計(jì)
2、統(tǒng)一多個(gè)類的接口設(shè)計(jì)
3、替換依賴的外部系統(tǒng)
4、兼容老版本接口
5、適配不同格式的數(shù)據(jù)
代理、橋接、裝飾器、適配器4種設(shè)計(jì)模式的區(qū)別
代理模式:代理模式在不改變?cè)碱惤涌诘臈l件下,為原始類定義一個(gè)代理類,主要目的是控制訪問,而非加強(qiáng)功能,這是它跟裝飾器模式最大的不同。
橋接模式:橋接模式的目的是將接口部分和實(shí)現(xiàn)部分分離,從而讓它們可以較為容易、也相對(duì)獨(dú)立地加以改變。
裝飾器模式:裝飾者模式在不改變?cè)碱惤涌诘那闆r下,對(duì)原始類功能進(jìn)行增強(qiáng),并且支持多個(gè)裝飾器的嵌套使用。
適配器模式:適配器模式是一種事后的補(bǔ)救策略。適配器提供跟原始類不同的接口,而代理模式、裝飾器模式提供的都是跟原始類相同的接口。
參考
【文中代碼】https://github.com/boilingfrog/design-pattern-learning/tree/master/適配器模式
【大話設(shè)計(jì)模式】https://book.douban.com/subject/2334288/
【極客時(shí)間】https://time.geekbang.org/column/intro/100039001
【菜鳥教程】https://www.runoob.com/design-pattern/adapter-pattern.html
【詩適配器模式】https://boilingfrog.github.io/2021/11/14/使用go實(shí)現(xiàn)適配器模式/
到此這篇關(guān)于使用go實(shí)現(xiàn)適配器模式的文章就介紹到這了,更多相關(guān)go適配器模式內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://www.cnblogs.com/ricklz/p/15552211.html