Golang - Design Pattern #14: 外觀模式 (Facade)

閱讀時間約 5 分鐘
raw-image
🏢 簡化複雜系統介面 🏢

你知道那種感覺嗎?當你想從複雜的家電系統中只開啟你的電視和音響,卻需要找一大堆遙控器才能完成。外觀模式(Facade)就是這樣的解決方案!它可以幫助我們簡化複雜系統的操作,提供一個單一、簡單的接口。


外觀模式 🖥️🎛️

外觀模式的主要目的是隱藏系統的複雜性,並提供一個客戶端可以輕鬆訪問的接口。它不只是關於隱藏複雜性,而是提供一個有意義的、統一的接口。


實際的例子


🎮 娛樂系統

想像一下你家裡有一套豪華的娛樂系統:電視、音響、遊戲機和燈光系統。你每次要看電影都得開啟電視、調整音響、關掉燈和打開遊戲機。太麻煩了!所以我們要用外觀模式來簡化這一切。


package main

import "fmt"

// 子系統1
type Television struct{}
func (tv *Television) TurnOn() { fmt.Println("Turning on the TV!") }

// 子系統2
type SoundSystem struct{}
func (ss *SoundSystem) SetVolume() { fmt.Println("Setting volume to medium!") }

// 子系統3
type Lights struct{}
func (l *Lights) Dim() { fmt.Println("Dimming the lights!") }

// 外觀
type HomeTheaterFacade struct {
tv Television
ss SoundSystem
l Lights
}

func (htf *HomeTheaterFacade) WatchMovie() {
htf.tv.TurnOn()
htf.ss.SetVolume()
htf.l.Dim()
fmt.Println("Ready to watch a movie!")
}

func main() {
ht := HomeTheaterFacade{}
ht.WatchMovie()
}

在上面的例子中,我們有 Television, SoundSystemLights。這些都是複雜的子系統,我們通常需要多步驟操作它們。但透過外觀模式,我們將這些子系統的操作封裝在 HomeTheaterFacade 裡,提供一個 WatchMovie 的方法,讓我們可以一鍵完成所有操作!


☕ 咖啡機

想像一下,你有一台全自動的咖啡機,它可以磨咖啡豆、加熱水、攪拌,然後為你製作一杯完美的咖啡。但如果每次你想喝咖啡時,都需要手動操作每一步驟,這會讓人覺得很不方便。因此,我們可以用外觀模式來封裝所有這些操作,並提供一個一鍵製作咖啡的方法。


package main

import "fmt"

// 子系統1
type Grinder struct{}
func (g *Grinder) GrindBeans() { fmt.Println("Grinding the coffee beans!") }

// 子系統2
type Heater struct{}
func (h *Heater) HeatWater() { fmt.Println("Heating the water!") }

// 子系統3
type Mixer struct{}
func (m *Mixer) Mix() { fmt.Println("Mixing the coffee!") }

// 外觀
type CoffeeMachineFacade struct {
grinder Grinder
heater Heater
mixer Mixer
}

func (cm *CoffeeMachineFacade) MakeCoffee() {
cm.grinder.GrindBeans()
cm.heater.HeatWater()
cm.mixer.Mix()
fmt.Println("Your coffee is ready!")
}

func main() {
coffeeMachine := CoffeeMachineFacade{}
coffeeMachine.MakeCoffee()
}

在這個例子中,我們的 Grinder, HeaterMixer 分別代表咖啡機的磨豆、加熱和攪拌功能。這些操作可能各自涉及到很多細節和步驟,但我們不希望使用者需要瞭解所有這些。


結論 🎉

外觀模式是一個超實用的設計模式,它幫助我們隱藏複雜的子系統操作,提供一個簡單的接口。就像我們的娛樂系統例子,現在只需要一個按鈕,就能輕鬆觀影了!

30會員
193內容數
歡迎來到【代碼的詩情】:探索程式語言之美 系列,這是一場優雅的程式之旅,透過詩歌的抒發,尋找不同程式語言的美感和精髓。 在這個系列中,我們將透過文字的韻律,深入探索多種程式語言的核心概念和語法,以及它們獨特的應用和技巧。每一篇詩歌都是一個故事,每一段代碼都是一句詩句,讓代碼的旋律和詩情在其中相互交織。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
創作者要怎麼好好休息 + 避免工作過量?《黑貓創作報#4》午安,最近累不累? 這篇不是虛假的關心。而是《黑貓創作報》發行以來可能最重要的一篇。 是的,我們這篇講怎麼補充能量,也就是怎麼休息。
Thumbnail
avatar
黑貓老師
2024-06-29
防曬產品係數測試報告彙整(2024年)從2014年起,自己對於市售防曬產品的效能產生了濃厚的興趣。因為當時候發現不少產品的防曬係數其實標示是有問題的,像是原本應該是人體測試的SPF與PA數值,實際上沒有做,只用機器測試的數據來充當,但這兩者卻有很大的差異。像是防曬係數其實有強度、廣度與平均度三個面向需要一起判斷,但多數廠商並沒有完整標示
Thumbnail
avatar
邱品齊皮膚科醫師
2023-04-27
Golang 的資料型別一覽👨‍💻簡介 Go 語言有各種資料型別,分為基本型別和複合型別。基本型別包括: 整數、浮點數、布林值、字串 複合型別包括: 陣列、片段、結構、函式、對映、通道、介面 等。 整數型別 整數型別有許多種,像是 int8、int16、int32、int64。我們可以依據實際需求選擇。
Thumbnail
avatar
wang alan
2023-08-17
韓國SONO CALM GOYANG HOTEL跟團住在號稱5星級飯店,SONO CALM GOYANG HOTEL 出發前在網路上找不到相關資料,google附近的地圖失真,於是來發一篇文 沒拍房間內部,房間還蠻大的,兩張單人床中間兩旁都有空間可以走動,開放式衣架,備品有小瓶沐浴乳、洗髮精、潤髮乳,都是濃濃的薄荷味,如果不能接受的話,最好自
Thumbnail
avatar
lunar
2023-07-13
Design | JPEG、PNG、PDF 差異與介紹這篇文章將會講述常用圖檔的檔案格式差異、比較和應用。
Thumbnail
avatar
瓶裝雪
2022-11-16
Designer | 個人專案(Side Project)Side Project 是打破傳說魔咒的解咒法,對於新鮮人來說,要找工作大多都要求工作經驗,然而這就跟打副本需要至少兩次刷副本的經驗一樣,若在團隊中沒有熟人,永遠會卡在等級一。
Thumbnail
avatar
瓶裝雪
2022-07-13
Singleton design patternSingleton design pattern
Thumbnail
avatar
Vic Lin
2020-08-20
Web Design Hong Kong - MiracleWeb design Agency Miracle Hong Kong understands the importance of a website design that works and converts your target audience into customers. We hav
avatar
Marlon Francis
2020-03-18
Design about food X 消化 Digest|篆刻創作特展 從服務生小姐到藝術家,從飲食色彩活動到個人篆刻特展,我很榮幸身邊有一位跟我一樣關注飲食與人,熱愛自我探索、享受實驗驗證過程的好朋友 -蔡大暇
Thumbnail
avatar
Amber 詹慧珍
2020-02-20
建立 Golang http web server建議先看過Golang 入門這篇再閱讀這篇! 使用Go官方提供的net/http library就能建立http web伺服器囉!
Thumbnail
avatar
Vic Lin
2019-11-16
Golang 入門Golang 入門
Thumbnail
avatar
Vic Lin
2019-11-09
Golang RegExp Notes遙想當年初探 Regular Expression,腦袋紮紮實實地被凌虐了一番,同時十分敬佩把正規表示式寫的簡潔有力又精確無誤的神人。最近學校在上編譯器課程,估計近期內便會接觸到不少 RegExp 的技巧,於是就來寫篇筆記吧~
Thumbnail
avatar
Rain Wu
2019-03-17