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
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
👨‍💻簡介 Go 語言有各種資料型別,分為基本型別和複合型別。基本型別包括: 整數、浮點數、布林值、字串 複合型別包括: 陣列、片段、結構、函式、對映、通道、介面 等。 整數型別 整數型別有許多種,像是 int8、int16、int32、int64。我們可以依據實際需求選擇。
Thumbnail
跟團住在號稱5星級飯店,SONO CALM GOYANG HOTEL 出發前在網路上找不到相關資料,google附近的地圖失真,於是來發一篇文 沒拍房間內部,房間還蠻大的,兩張單人床中間兩旁都有空間可以走動,開放式衣架,備品有小瓶沐浴乳、洗髮精、潤髮乳,都是濃濃的薄荷味,如果不能接受的話,最好自
Thumbnail
這篇文章將會講述常用圖檔的檔案格式差異、比較和應用。
Thumbnail
Side Project 是打破傳說魔咒的解咒法,對於新鮮人來說,要找工作大多都要求工作經驗,然而這就跟打副本需要至少兩次刷副本的經驗一樣,若在團隊中沒有熟人,永遠會卡在等級一。
Web design Agency Miracle Hong Kong understands the importance of a website design that works and converts your target audience into customers. We hav
Thumbnail
從服務生小姐到藝術家,從飲食色彩活動到個人篆刻特展,我很榮幸身邊有一位跟我一樣關注飲食與人,熱愛自我探索、享受實驗驗證過程的好朋友 -蔡大暇
Thumbnail
建議先看過Golang 入門這篇再閱讀這篇! 使用Go官方提供的net/http library就能建立http web伺服器囉!
Thumbnail
遙想當年初探 Regular Expression,腦袋紮紮實實地被凌虐了一番,同時十分敬佩把正規表示式寫的簡潔有力又精確無誤的神人。最近學校在上編譯器課程,估計近期內便會接觸到不少 RegExp 的技巧,於是就來寫篇筆記吧~
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
👨‍💻簡介 Go 語言有各種資料型別,分為基本型別和複合型別。基本型別包括: 整數、浮點數、布林值、字串 複合型別包括: 陣列、片段、結構、函式、對映、通道、介面 等。 整數型別 整數型別有許多種,像是 int8、int16、int32、int64。我們可以依據實際需求選擇。
Thumbnail
跟團住在號稱5星級飯店,SONO CALM GOYANG HOTEL 出發前在網路上找不到相關資料,google附近的地圖失真,於是來發一篇文 沒拍房間內部,房間還蠻大的,兩張單人床中間兩旁都有空間可以走動,開放式衣架,備品有小瓶沐浴乳、洗髮精、潤髮乳,都是濃濃的薄荷味,如果不能接受的話,最好自
Thumbnail
這篇文章將會講述常用圖檔的檔案格式差異、比較和應用。
Thumbnail
Side Project 是打破傳說魔咒的解咒法,對於新鮮人來說,要找工作大多都要求工作經驗,然而這就跟打副本需要至少兩次刷副本的經驗一樣,若在團隊中沒有熟人,永遠會卡在等級一。
Web design Agency Miracle Hong Kong understands the importance of a website design that works and converts your target audience into customers. We hav
Thumbnail
從服務生小姐到藝術家,從飲食色彩活動到個人篆刻特展,我很榮幸身邊有一位跟我一樣關注飲食與人,熱愛自我探索、享受實驗驗證過程的好朋友 -蔡大暇
Thumbnail
建議先看過Golang 入門這篇再閱讀這篇! 使用Go官方提供的net/http library就能建立http web伺服器囉!
Thumbnail
遙想當年初探 Regular Expression,腦袋紮紮實實地被凌虐了一番,同時十分敬佩把正規表示式寫的簡潔有力又精確無誤的神人。最近學校在上編譯器課程,估計近期內便會接觸到不少 RegExp 的技巧,於是就來寫篇筆記吧~