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. 集中控制:仲介者提供了一個集中的地方來管理和調整物件間的互動。


小結

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

留言
avatar-img
KH Huang的沙龍
38會員
218內容數
歡迎來到【代碼的詩情】:探索程式語言之美 系列,這是一場優雅的程式之旅,透過詩歌的抒發,尋找不同程式語言的美感和精髓。 在這個系列中,我們將透過文字的韻律,深入探索多種程式語言的核心概念和語法,以及它們獨特的應用和技巧。每一篇詩歌都是一個故事,每一段代碼都是一句詩句,讓代碼的旋律和詩情在其中相互交織。
KH Huang的沙龍的其他內容
2023/09/06
嗨!今天我們來深入探討鏈式方法模式,也就是讓你可以一路連續調用方法,看起來好像在鏈接它們似的。那麼,讓我們馬上進入主題吧!
Thumbnail
2023/09/06
嗨!今天我們來深入探討鏈式方法模式,也就是讓你可以一路連續調用方法,看起來好像在鏈接它們似的。那麼,讓我們馬上進入主題吧!
Thumbnail
2023/09/03
嗨,大家好!今天我們來聊聊什麼是延遲評估模式,它的好處是啥,還有在 Go 裡面是怎麼玩的。
Thumbnail
2023/09/03
嗨,大家好!今天我們來聊聊什麼是延遲評估模式,它的好處是啥,還有在 Go 裡面是怎麼玩的。
Thumbnail
2023/09/03
在許多大型系統中,不同的子系統需要共享和修改某些資訊以達到一個共同目的。在這種情況下,傳統的方法可能會造成混亂和冗餘。這時,黑板模式出現了,它提供了一個統一的架構,讓這些子系統可以有效率地協作。
Thumbnail
2023/09/03
在許多大型系統中,不同的子系統需要共享和修改某些資訊以達到一個共同目的。在這種情況下,傳統的方法可能會造成混亂和冗餘。這時,黑板模式出現了,它提供了一個統一的架構,讓這些子系統可以有效率地協作。
Thumbnail
看更多
你可能也想看
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
伴侶諮商很難,困難之一是要能將觀點轉移成「系統觀點」,能看見伴侶之間舞出的負向互動模式。然而只擁有系統觀點,並不足以應付伴侶諮商實務上的需要。我們面對的,是許多關於人性的需求與渴望等議題,像是伴侶間發生欺騙、背叛、被輕蔑、遺棄、被拒絕、失去控制感等複雜經驗,我們更需要知道這些人性議題是如何影響著他們
Thumbnail
伴侶諮商很難,困難之一是要能將觀點轉移成「系統觀點」,能看見伴侶之間舞出的負向互動模式。然而只擁有系統觀點,並不足以應付伴侶諮商實務上的需要。我們面對的,是許多關於人性的需求與渴望等議題,像是伴侶間發生欺騙、背叛、被輕蔑、遺棄、被拒絕、失去控制感等複雜經驗,我們更需要知道這些人性議題是如何影響著他們
Thumbnail
溝通是雙向的 溝通的意思是互相了解對方想法/交換想法,溝通可分為兩部份,要完成這兩部份,有來有往,才是有效的溝通。 聆聽別人 表達自己 當我們有情緒的時候,在溝通過程中會衝口而出說了一些不該說的話,這樣不但無法解決事情,還令事情更糟。如何做到讓另一半冷靜地聆聽你的需求,而你又能夠表達自己?吵
Thumbnail
溝通是雙向的 溝通的意思是互相了解對方想法/交換想法,溝通可分為兩部份,要完成這兩部份,有來有往,才是有效的溝通。 聆聽別人 表達自己 當我們有情緒的時候,在溝通過程中會衝口而出說了一些不該說的話,這樣不但無法解決事情,還令事情更糟。如何做到讓另一半冷靜地聆聽你的需求,而你又能夠表達自己?吵
Thumbnail
情感交流中,互相影響是至關重要的。高情商在於平和溝通,取得自我與對方的平衡。非以強烈情緒表達自己的立場,而是通過溝通和情緒表達,達到目標。積極的互動能夠創建穩固的關係基礎,並改善婚姻關係。互相影響的方式可以是簡單的小動作,也可以透過微妙的表情產生正面的影響。
Thumbnail
情感交流中,互相影響是至關重要的。高情商在於平和溝通,取得自我與對方的平衡。非以強烈情緒表達自己的立場,而是通過溝通和情緒表達,達到目標。積極的互動能夠創建穩固的關係基礎,並改善婚姻關係。互相影響的方式可以是簡單的小動作,也可以透過微妙的表情產生正面的影響。
Thumbnail
調解是一種解決爭議的非訴訟手段,通過一個中立的第三者(調解委員)來協助爭議雙方進行溝通,促進雙方達成共識,解決爭議。調解的優點包括節省時間和金錢、當事人具有主導權、不撕破臉、客觀公正等。調解適用於許多不同類型的爭議,例如家事、勞資、商業、鄰居、校園、不動產相關等。
Thumbnail
調解是一種解決爭議的非訴訟手段,通過一個中立的第三者(調解委員)來協助爭議雙方進行溝通,促進雙方達成共識,解決爭議。調解的優點包括節省時間和金錢、當事人具有主導權、不撕破臉、客觀公正等。調解適用於許多不同類型的爭議,例如家事、勞資、商業、鄰居、校園、不動產相關等。
Thumbnail
想起之前在讀書會上討論的話題——當我們在社群平台看到不合時宜的發言,甚至是針對我們自己所屬群體(ex: 文組、女性、支持某些理念者……)的抹黑與攻擊時,是否應該主動發言表達不同觀點或甚至適時反擊? 『如果自己什麼都不說,會不會久了大家就會認為他們是對的?』朋友認為,不同的聲音很重要,表達自己的立場
Thumbnail
想起之前在讀書會上討論的話題——當我們在社群平台看到不合時宜的發言,甚至是針對我們自己所屬群體(ex: 文組、女性、支持某些理念者……)的抹黑與攻擊時,是否應該主動發言表達不同觀點或甚至適時反擊? 『如果自己什麼都不說,會不會久了大家就會認為他們是對的?』朋友認為,不同的聲音很重要,表達自己的立場
Thumbnail
現代人普遍使用社群軟體聊天,字尾如果沒有加上表情符號容易產生距離和誤解。人跟人之間的溝通不是一件容易的事,要好好講話、講好話,一句話講得不好,就是結惡的開始。 老師父說,如果能好好說話,就像在兩個人之間搭起一座橋,讓彼此都能輕易上橋,走進對方的心,那樣的對話就是成功。如果不能好好講話,聲色粗厲
Thumbnail
現代人普遍使用社群軟體聊天,字尾如果沒有加上表情符號容易產生距離和誤解。人跟人之間的溝通不是一件容易的事,要好好講話、講好話,一句話講得不好,就是結惡的開始。 老師父說,如果能好好說話,就像在兩個人之間搭起一座橋,讓彼此都能輕易上橋,走進對方的心,那樣的對話就是成功。如果不能好好講話,聲色粗厲
Thumbnail
溝通成長
Thumbnail
溝通成長
Thumbnail
本文探討溝通交流中的情緒衝突以及化解方式,針對四個關鍵要素(覺察、感受、開放、彈性)進行了具體分析,並提供了實際的溝通技巧和建議。
Thumbnail
本文探討溝通交流中的情緒衝突以及化解方式,針對四個關鍵要素(覺察、感受、開放、彈性)進行了具體分析,並提供了實際的溝通技巧和建議。
Thumbnail
想知道如何跟異性有趣地聊天?從閱讀建立觀點、生活經驗及點線面法則開始!文章分享3步驟讓話題更豐富有趣。透過觀點、延伸解釋及案例證明,創造支撐內容,讓聊天更有深度。
Thumbnail
想知道如何跟異性有趣地聊天?從閱讀建立觀點、生活經驗及點線面法則開始!文章分享3步驟讓話題更豐富有趣。透過觀點、延伸解釋及案例證明,創造支撐內容,讓聊天更有深度。
Thumbnail
你還記得在學校時代,當兩位朋友吵架時,有時會有第三者出來做調解嗎?在程式設計中,我們有一種模式就像那位調解者,幫助兩個物件之間保持距離,這就是仲介者模式( Mediator Pattern )!
Thumbnail
你還記得在學校時代,當兩位朋友吵架時,有時會有第三者出來做調解嗎?在程式設計中,我們有一種模式就像那位調解者,幫助兩個物件之間保持距離,這就是仲介者模式( Mediator Pattern )!
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News