Golang - Design Pattern #13: 仲介者模式 ( Mediator)

閱讀時間約 6 分鐘
raw-image
🔗 將物件解耦合 🔗

你還記得在學校時代,當兩位朋友吵架時,有時會有第三者出來做調解嗎?在程式設計中,我們有一種模式就像那位調解者,幫助兩個物件之間保持距離,這就是仲介者模式( Mediator Pattern )!


仲介者模式是啥?

仲介者模式使用一個獨立的物件來封裝一系列的物件之間的互動。目的是使這些物件不直接互動,減少它們之間的依賴。這樣當其中一個物件改變時,不會影響到其他物件。


實際的例子


📱 聊天應用

想像你正在使用一個群組聊天應用,每當有人發送消息,其它人都可以看到。在這裡,聊天室就是仲介者,用戶只需告訴聊天室他們要傳遞的消息,然後聊天室會通知其他用戶。


package main

import "fmt"

// User represents each individual in the chat
type User struct {
Name string
ChatMediator Mediator
}

// SendMessage sends the user's message to the chat room
func (u *User) SendMessage(message string) {
u.ChatMediator.SendMessage(message, u)
}

// ReceiveMessage is called when a message is received from the chat room
func (u *User) ReceiveMessage(message string) {
fmt.Printf("%s received: %s\n", u.Name, message)
}

// Mediator is an interface representing the middle-man in communication
type Mediator interface {
SendMessage(string, *User)
}

// ChatRoom acts as the mediator for user messages
type ChatRoom struct {
Users []*User
}

// SendMessage broadcasts the message from the sender to all other users in the chat room
func (c *ChatRoom) SendMessage(message string, user *User) {
for _, u := range c.Users {
if u != user {
u.ReceiveMessage(message)
}
}
}

func main() {
alice := &User{Name: "Alice"}
bob := &User{Name: "Bob"}
chatRoom := &ChatRoom{Users: []*User{alice, bob}}
alice.ChatMediator = chatRoom
bob.ChatMediator = chatRoom
alice.SendMessage("Hi Bob!")
bob.SendMessage("Hello Alice!")
}


🚦 交通指揮中心

想像一下城市中的交通燈。如果每個交通燈都自行運作,可能會引起混亂。我們需要一個交通指揮中心來協調它們。


package main

import (
"fmt"
)

type Mediator interface {
Notify(sender TrafficLight, event string)
}

type TrafficCommandCenter struct {
lights []*TrafficLight
}

func (tcc *TrafficCommandCenter) Notify(sender TrafficLight, event string) {
if event == "GREEN" {
for _, light := range tcc.lights {
if light != &sender {
light.TurnRed()
}
}
}
}

type TrafficLight struct {
color string
mediator Mediator
}

func (tl *TrafficLight) TurnGreen() {
tl.color = "GREEN"
tl.mediator.Notify(*tl, "GREEN")
fmt.Println("Traffic light is now GREEN!")
}

func (tl *TrafficLight) TurnRed() {
tl.color = "RED"
fmt.Println("Traffic light is now RED!")
}

func main() {
tcc := &TrafficCommandCenter{}
light1 := &TrafficLight{color: "RED", mediator: tcc}
light2 := &TrafficLight{color: "RED", mediator: tcc}
tcc.lights = append(tcc.lights, light1, light2)

light1.TurnGreen() // This should turn light1 to GREEN and light2 to RED
light2.TurnGreen() // This should turn light2 to GREEN and light1 to RED
}



為什麼要用仲介者模式?

  1. 減少物件間的耦合:使用仲介者可以減少物件間的直接依賴,使得系統更加模組化。
  2. 集中控制:仲介者提供了一個集中的地方來管理和調整物件間的互動。


小結

仲介者模式可以幫助我們管理和調整物件間的互動。使用它,我們可以確保物件間的互動是有序的,並且可以輕鬆地進行調整。在設計大型系統時,這種模式可以為我們提供很大的便利 ~~~👏

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