Golang - Design Pattern #9: 適配器模式 (Adapter)

閱讀時間約 4 分鐘
raw-image
當你的充電線不合適,你怎麼辦?

嗨,各位!大家有沒有買過新的手機或筆電,然後發現充電線插頭跟你家的插座不匹配?這時候你會怎麼辦?找個轉接頭來用對吧!今天我們就來聊聊在程式設計中的「轉接頭」── 適配器模式(Adapter Pattern)!


轉接頭的魔法

在程式設計中,有時我們會碰到兩個不兼容的接口需要互相合作。這時候,適配器模式就像是個轉接頭,幫忙接上兩端,讓一切都能順暢運作。


馬上來做做看!


💾 舊的資料儲存系統與新的API


想像你有個舊系統,資料是儲存在一個簡單的文檔裡。現在,有一個新的 API 可以讓你存取雲端儲存,但這新 API 和舊系統的方法名稱不同。怎麼辦?


// 舊的文檔儲存系統
type OldStorage struct{}

func (o *OldStorage) SaveToFile(data string) {
fmt.Println("Saving data to file:", data)
}

// 新的雲端API
type CloudAPI struct{}

func (c *CloudAPI) UploadToCloud(data string) {
fmt.Println("Uploading data to cloud:", data)
}

// 適配器
type CloudAdapter struct {
cloud *CloudAPI
}

func (ca *CloudAdapter) SaveToFile(data string) {
ca.cloud.UploadToCloud(data)
}

func main() {
oldStorage := &OldStorage{}
oldStorage.SaveToFile("Hello from old system!")

adapter := &CloudAdapter{cloud: &CloudAPI{}}
adapter.SaveToFile("Hello from new system via adapter!")
}


🎧 不同的音樂播放器


有些音樂播放器只能播放MP3,有些只能播放WAV,如果我們想要一個通用的播放器怎麼辦?


// 一般的MP3播放器
type MP3Player struct{}

func (m *MP3Player) PlayMP3(data string) {
fmt.Println("Playing MP3:", data)
}

// 專門的WAV播放器
type WAVPlayer struct{}

func (w *WAVPlayer) PlayWAV(data string) {
fmt.Println("Playing WAV:", data)
}

// 適配器
type UniversalPlayer struct {
mp3 *MP3Player
wav *WAVPlayer
}

func (u *UniversalPlayer) Play(data, fileType string) {
if fileType == "mp3" {
u.mp3.PlayMP3(data)
} else if fileType == "wav" {
u.wav.PlayWAV(data)
}
}

func main() {
player := &UniversalPlayer{mp3: &MP3Player{}, wav: &WAVPlayer{}}
player.Play("Rock Song", "mp3")
player.Play("Classical Tune", "wav")
}


小結

適配器模式就像生活中的轉接頭,幫助我們在遇到不同接口時,讓它們可以無縫地工作在一起。不管是舊系統和新API,或是不同的音樂格式,只要有了適配器,一切都不是問題!

avatar-img
31會員
194內容數
歡迎來到【代碼的詩情】:探索程式語言之美 系列,這是一場優雅的程式之旅,透過詩歌的抒發,尋找不同程式語言的美感和精髓。 在這個系列中,我們將透過文字的韻律,深入探索多種程式語言的核心概念和語法,以及它們獨特的應用和技巧。每一篇詩歌都是一個故事,每一段代碼都是一句詩句,讓代碼的旋律和詩情在其中相互交織。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
KH Huang的沙龍 的其他內容
大家好!今天我們要來聊聊「狀態模式 (State)」。如果你把物件想像成一個人,那麼狀態模式就是用來管理這個人的 「心情」轉變。一個物件在不同的狀態下可能會有不同的行為,就好像我們在不同的心情下反應也不同,對吧?
大家好!今天我們來談談模板方法模式(Template Method)。它有點像給你一份麵包的食譜,告訴你該怎麼混合、發酵和烘焙,但是具體的材料和調味料,就交給你自己去選擇和調整。它定義了一個演算法的步驟,但留下了一些具體的實現讓子類去完成。
你還記得小時候玩的樂高嗎?一塊一塊的組裝起來,每塊都增加了更多的功能。裝飾者模式也是這樣,給你一種疊加功能的感覺,但卻不會搞亂原有的設計。
你有沒有用過智能家居遙控器,按一下開燈、再按一下關電視?那麼,你可能已經用過命令模式了!
有沒有想過,當你在YouTube訂閱了一個頻道,每當有新影片,你就會得到通知呢?這背後就是觀察者模式在運作!
當面臨多種算法或策略的選擇,策略模式可以作為一個非常有效的解決方案。它允許我們在運行時選擇不同的策略,從而使程式碼更加靈活和可擴展。
大家好!今天我們要來聊聊「狀態模式 (State)」。如果你把物件想像成一個人,那麼狀態模式就是用來管理這個人的 「心情」轉變。一個物件在不同的狀態下可能會有不同的行為,就好像我們在不同的心情下反應也不同,對吧?
大家好!今天我們來談談模板方法模式(Template Method)。它有點像給你一份麵包的食譜,告訴你該怎麼混合、發酵和烘焙,但是具體的材料和調味料,就交給你自己去選擇和調整。它定義了一個演算法的步驟,但留下了一些具體的實現讓子類去完成。
你還記得小時候玩的樂高嗎?一塊一塊的組裝起來,每塊都增加了更多的功能。裝飾者模式也是這樣,給你一種疊加功能的感覺,但卻不會搞亂原有的設計。
你有沒有用過智能家居遙控器,按一下開燈、再按一下關電視?那麼,你可能已經用過命令模式了!
有沒有想過,當你在YouTube訂閱了一個頻道,每當有新影片,你就會得到通知呢?這背後就是觀察者模式在運作!
當面臨多種算法或策略的選擇,策略模式可以作為一個非常有效的解決方案。它允許我們在運行時選擇不同的策略,從而使程式碼更加靈活和可擴展。
你可能也想看
Google News 追蹤
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
當你旅行到不同國家時,你可能會遇到不同的插座類型和電壓規格。如果你只帶了一台手機充電器,卻沒有合適的轉接器,無論你的手機多麼高級它都無法充電。這時候一個小小的插頭轉接器就能救你一命,讓你的裝置可以順利使用。這個插頭轉接器的角色,就像軟體設計中的轉接器模式 Adapter Pattern 一樣。
Thumbnail
出門匆匆忙忙,發現手機沒電卻找不到充電線嗎? YOMIX優迷二合一編織掛繩充電傳輸線能夠一線兩用,是手機掛繩也是快充充電線,輕鬆掛在身上,走到哪、拎到哪~ 還有5大安全保護機制,不只方便還安心!
Thumbnail
最近因為用鋰鐵電池和佔位筒取代一般的乾電池,但是常常發生過放觸發保護板鎖定,我又為了省錢,沒有買專用充電器,所以常常在救電池。救著救著也有點心得了。但就是要接線有點麻煩,所以想買方便插麵包板的電池座,但一時想不出來那個線叫啥…
Thumbnail
旅行經驗豐富的我,對充電插頭的需求一直都很高。最近入手了一款Targus的旅行充電插頭,簡直是旅行者的夢幻好物呀。它的外觀設計簡約且有質感,線條流暢,握在手裡感覺非常舒適🥰 這款充電插頭最大的亮點是支援多國規格的插座頭。無論是去歐美、亞洲還是其他地區,只需輕鬆一鍵替換插頭,就能迅速適應當地的插座
Thumbnail
對於遠距工作者或是數位遊牧族群來說,只要有網路、電源跟自己的一台筆電,就可以在全世界的每一個角落創造你的產值。 在充電方面,很多時候在咖啡廳或是免費的工作空間,都會遇到插座僧多粥少的情況,這時候一個多孔高瓦數的充電頭就可以大大解決這樣的困境,而這次體驗的UGREEN 綠聯 200W 六孔氮化鎵
** 3C機構設計爸版權所有 ©️ ** 當我們討論到USB時,大家都知道USB對於一般的使用者來說是接觸性非常高的一個接口,舉凡手機、電腦、電視、收銀機….,都會使用到USB接口。雖然國際上已經定義了USB-C (USB type-C)是未來統一的一種接口,但就目前而言,USB connec
Thumbnail
** 3C機構設計爸版權所有 ** USB 是我們每天生活上所使用的device中最常有的I/O port,舉凡TV、cash machine、PC、Server、phone、……等等,數不完的device都有USB 接口,當然也存在著不同種類的USB接口,在下次的分享中,3C機構設計爸會做一個U
Thumbnail
這次收到Targus 多國旅行充電轉接頭,剛好這次旅遊派上用場! 以前都是拿多個豆腐頭出門,現在只需要帶一個充電轉接頭出門即可 可以充USB-C筆記型電腦、平板電腦和手機
Thumbnail
在現代社會,我們或多或少都會帶著電子用品一起旅行,像是手機、平板、筆電,這些都是我們很常攜帶工具,然而只要是電子用品就需要供電,只要關乎到充電,就勢必得要找到插座才能充電,如何避免在旅行的時候電器沒電呢?
Thumbnail
您以為自己很複雜,也只不過是一條多孔的轉插頭...
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
當你旅行到不同國家時,你可能會遇到不同的插座類型和電壓規格。如果你只帶了一台手機充電器,卻沒有合適的轉接器,無論你的手機多麼高級它都無法充電。這時候一個小小的插頭轉接器就能救你一命,讓你的裝置可以順利使用。這個插頭轉接器的角色,就像軟體設計中的轉接器模式 Adapter Pattern 一樣。
Thumbnail
出門匆匆忙忙,發現手機沒電卻找不到充電線嗎? YOMIX優迷二合一編織掛繩充電傳輸線能夠一線兩用,是手機掛繩也是快充充電線,輕鬆掛在身上,走到哪、拎到哪~ 還有5大安全保護機制,不只方便還安心!
Thumbnail
最近因為用鋰鐵電池和佔位筒取代一般的乾電池,但是常常發生過放觸發保護板鎖定,我又為了省錢,沒有買專用充電器,所以常常在救電池。救著救著也有點心得了。但就是要接線有點麻煩,所以想買方便插麵包板的電池座,但一時想不出來那個線叫啥…
Thumbnail
旅行經驗豐富的我,對充電插頭的需求一直都很高。最近入手了一款Targus的旅行充電插頭,簡直是旅行者的夢幻好物呀。它的外觀設計簡約且有質感,線條流暢,握在手裡感覺非常舒適🥰 這款充電插頭最大的亮點是支援多國規格的插座頭。無論是去歐美、亞洲還是其他地區,只需輕鬆一鍵替換插頭,就能迅速適應當地的插座
Thumbnail
對於遠距工作者或是數位遊牧族群來說,只要有網路、電源跟自己的一台筆電,就可以在全世界的每一個角落創造你的產值。 在充電方面,很多時候在咖啡廳或是免費的工作空間,都會遇到插座僧多粥少的情況,這時候一個多孔高瓦數的充電頭就可以大大解決這樣的困境,而這次體驗的UGREEN 綠聯 200W 六孔氮化鎵
** 3C機構設計爸版權所有 ©️ ** 當我們討論到USB時,大家都知道USB對於一般的使用者來說是接觸性非常高的一個接口,舉凡手機、電腦、電視、收銀機….,都會使用到USB接口。雖然國際上已經定義了USB-C (USB type-C)是未來統一的一種接口,但就目前而言,USB connec
Thumbnail
** 3C機構設計爸版權所有 ** USB 是我們每天生活上所使用的device中最常有的I/O port,舉凡TV、cash machine、PC、Server、phone、……等等,數不完的device都有USB 接口,當然也存在著不同種類的USB接口,在下次的分享中,3C機構設計爸會做一個U
Thumbnail
這次收到Targus 多國旅行充電轉接頭,剛好這次旅遊派上用場! 以前都是拿多個豆腐頭出門,現在只需要帶一個充電轉接頭出門即可 可以充USB-C筆記型電腦、平板電腦和手機
Thumbnail
在現代社會,我們或多或少都會帶著電子用品一起旅行,像是手機、平板、筆電,這些都是我們很常攜帶工具,然而只要是電子用品就需要供電,只要關乎到充電,就勢必得要找到插座才能充電,如何避免在旅行的時候電器沒電呢?
Thumbnail
您以為自己很複雜,也只不過是一條多孔的轉插頭...