2023-08-26|閱讀時間 ‧ 約 5 分鐘

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

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 分別代表咖啡機的磨豆、加熱和攪拌功能。這些操作可能各自涉及到很多細節和步驟,但我們不希望使用者需要瞭解所有這些。


結論 🎉

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

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.