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
31會員
194內容數
歡迎來到【代碼的詩情】:探索程式語言之美 系列,這是一場優雅的程式之旅,透過詩歌的抒發,尋找不同程式語言的美感和精髓。 在這個系列中,我們將透過文字的韻律,深入探索多種程式語言的核心概念和語法,以及它們獨特的應用和技巧。每一篇詩歌都是一個故事,每一段代碼都是一句詩句,讓代碼的旋律和詩情在其中相互交織。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
KH Huang的沙龍 的其他內容
你還記得那次與朋友一起的燒烤派對,大家輪流挑選食材放到烤架上烤嗎?這就好比使用迭代器模式 (Iterator Pattern) 來遍歷集合!讓我們一起來看看它是如何工作的,以及為什麼它如此有用。
你有沒有試著畫出家族樹或公司組織架構圖呢?如果有,那你其實已經初步了解「組合模式 (Composite Pattern)」了!這種模式就是用來處理這類包含部分和整體的樹狀結構。這篇文章,我們就來深入探討它是如何運作的。
嗨,各位!想像一下你住在一棟大樓里,每次有人要進來時,他們得先經過樓下的門禁員檢查,這樣才能確保大樓的安全。在程式設計的世界裡,我們也有類似的機制,那就是「代理模式 (Proxy Pattern)」!
嗨,各位!大家有沒有買過新的手機或筆電,然後發現充電線插頭跟你家的插座不匹配?這時候你會怎麼辦?找個轉接頭來用對吧!今天我們就來聊聊在程式設計中的「轉接頭」── 適配器模式(Adapter Pattern)!
大家好!今天我們要來聊聊「狀態模式 (State)」。如果你把物件想像成一個人,那麼狀態模式就是用來管理這個人的 「心情」轉變。一個物件在不同的狀態下可能會有不同的行為,就好像我們在不同的心情下反應也不同,對吧?
大家好!今天我們來談談模板方法模式(Template Method)。它有點像給你一份麵包的食譜,告訴你該怎麼混合、發酵和烘焙,但是具體的材料和調味料,就交給你自己去選擇和調整。它定義了一個演算法的步驟,但留下了一些具體的實現讓子類去完成。
你還記得那次與朋友一起的燒烤派對,大家輪流挑選食材放到烤架上烤嗎?這就好比使用迭代器模式 (Iterator Pattern) 來遍歷集合!讓我們一起來看看它是如何工作的,以及為什麼它如此有用。
你有沒有試著畫出家族樹或公司組織架構圖呢?如果有,那你其實已經初步了解「組合模式 (Composite Pattern)」了!這種模式就是用來處理這類包含部分和整體的樹狀結構。這篇文章,我們就來深入探討它是如何運作的。
嗨,各位!想像一下你住在一棟大樓里,每次有人要進來時,他們得先經過樓下的門禁員檢查,這樣才能確保大樓的安全。在程式設計的世界裡,我們也有類似的機制,那就是「代理模式 (Proxy Pattern)」!
嗨,各位!大家有沒有買過新的手機或筆電,然後發現充電線插頭跟你家的插座不匹配?這時候你會怎麼辦?找個轉接頭來用對吧!今天我們就來聊聊在程式設計中的「轉接頭」── 適配器模式(Adapter Pattern)!
大家好!今天我們要來聊聊「狀態模式 (State)」。如果你把物件想像成一個人,那麼狀態模式就是用來管理這個人的 「心情」轉變。一個物件在不同的狀態下可能會有不同的行為,就好像我們在不同的心情下反應也不同,對吧?
大家好!今天我們來談談模板方法模式(Template Method)。它有點像給你一份麵包的食譜,告訴你該怎麼混合、發酵和烘焙,但是具體的材料和調味料,就交給你自己去選擇和調整。它定義了一個演算法的步驟,但留下了一些具體的實現讓子類去完成。
你可能也想看
Google News 追蹤
在開發大型系統時,常常會發現各個物件之間的溝通愈來愈複雜,像是編織成了一張複雜的蜘蛛網。每個物件相互依賴,任何改動都可能牽一髮而動全身。這時候中介者模式就能幫助我們化繁為簡,成為一個「協調者」,讓物件之間的溝通變得簡單清晰。 什麼是中介者模式? 中介者模式是一種行為型設計模式,它讓物件之間的
Thumbnail
伴侶諮商很難,困難之一是要能將觀點轉移成「系統觀點」,能看見伴侶之間舞出的負向互動模式。然而只擁有系統觀點,並不足以應付伴侶諮商實務上的需要。我們面對的,是許多關於人性的需求與渴望等議題,像是伴侶間發生欺騙、背叛、被輕蔑、遺棄、被拒絕、失去控制感等複雜經驗,我們更需要知道這些人性議題是如何影響著他們
諮商師希望與個案之間只有諮商關係,不是朋友,更不可能邊諮商邊談戀愛。諮商也是建立在最純粹的諮商關係上才能好好發揮效用。文章談及關於諮商關係的祕密。
Thumbnail
溝通是雙向的 溝通的意思是互相了解對方想法/交換想法,溝通可分為兩部份,要完成這兩部份,有來有往,才是有效的溝通。 聆聽別人 表達自己 當我們有情緒的時候,在溝通過程中會衝口而出說了一些不該說的話,這樣不但無法解決事情,還令事情更糟。如何做到讓另一半冷靜地聆聽你的需求,而你又能夠表達自己?吵
※ 生產者和消費者模式 定義: 生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。 共同存取資料空間:生產者和消費者共享同一個資料空間。這個空間通常是緩衝區或隊列,用於在它
Thumbnail
調解是一種解決爭議的非訴訟手段,通過一個中立的第三者(調解委員)來協助爭議雙方進行溝通,促進雙方達成共識,解決爭議。調解的優點包括節省時間和金錢、當事人具有主導權、不撕破臉、客觀公正等。調解適用於許多不同類型的爭議,例如家事、勞資、商業、鄰居、校園、不動產相關等。
Thumbnail
動機式晤談—溝通方式與會談技巧 本章分兩個主題:溝通方式與會談技巧。
Thumbnail
現代人普遍使用社群軟體聊天,字尾如果沒有加上表情符號容易產生距離和誤解。人跟人之間的溝通不是一件容易的事,要好好講話、講好話,一句話講得不好,就是結惡的開始。 老師父說,如果能好好說話,就像在兩個人之間搭起一座橋,讓彼此都能輕易上橋,走進對方的心,那樣的對話就是成功。如果不能好好講話,聲色粗厲
Thumbnail
這篇專欄討論了現代人溝通方式的差異,以及作者對於當面聊天的態度。他分享了與朋友蔡兄之間的聊天風格和分享的生活經歷。文章中,作者談到了人生觀、媒體對思維的影響以及生活中多樣化的觀點。同時也提到了生活中的抉擇和尊重。文章內涵豐富,提供了觀點和啟發,適合現代人重視自我發展和生活態度的思考。
在開發大型系統時,常常會發現各個物件之間的溝通愈來愈複雜,像是編織成了一張複雜的蜘蛛網。每個物件相互依賴,任何改動都可能牽一髮而動全身。這時候中介者模式就能幫助我們化繁為簡,成為一個「協調者」,讓物件之間的溝通變得簡單清晰。 什麼是中介者模式? 中介者模式是一種行為型設計模式,它讓物件之間的
Thumbnail
伴侶諮商很難,困難之一是要能將觀點轉移成「系統觀點」,能看見伴侶之間舞出的負向互動模式。然而只擁有系統觀點,並不足以應付伴侶諮商實務上的需要。我們面對的,是許多關於人性的需求與渴望等議題,像是伴侶間發生欺騙、背叛、被輕蔑、遺棄、被拒絕、失去控制感等複雜經驗,我們更需要知道這些人性議題是如何影響著他們
諮商師希望與個案之間只有諮商關係,不是朋友,更不可能邊諮商邊談戀愛。諮商也是建立在最純粹的諮商關係上才能好好發揮效用。文章談及關於諮商關係的祕密。
Thumbnail
溝通是雙向的 溝通的意思是互相了解對方想法/交換想法,溝通可分為兩部份,要完成這兩部份,有來有往,才是有效的溝通。 聆聽別人 表達自己 當我們有情緒的時候,在溝通過程中會衝口而出說了一些不該說的話,這樣不但無法解決事情,還令事情更糟。如何做到讓另一半冷靜地聆聽你的需求,而你又能夠表達自己?吵
※ 生產者和消費者模式 定義: 生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。 共同存取資料空間:生產者和消費者共享同一個資料空間。這個空間通常是緩衝區或隊列,用於在它
Thumbnail
調解是一種解決爭議的非訴訟手段,通過一個中立的第三者(調解委員)來協助爭議雙方進行溝通,促進雙方達成共識,解決爭議。調解的優點包括節省時間和金錢、當事人具有主導權、不撕破臉、客觀公正等。調解適用於許多不同類型的爭議,例如家事、勞資、商業、鄰居、校園、不動產相關等。
Thumbnail
動機式晤談—溝通方式與會談技巧 本章分兩個主題:溝通方式與會談技巧。
Thumbnail
現代人普遍使用社群軟體聊天,字尾如果沒有加上表情符號容易產生距離和誤解。人跟人之間的溝通不是一件容易的事,要好好講話、講好話,一句話講得不好,就是結惡的開始。 老師父說,如果能好好說話,就像在兩個人之間搭起一座橋,讓彼此都能輕易上橋,走進對方的心,那樣的對話就是成功。如果不能好好講話,聲色粗厲
Thumbnail
這篇專欄討論了現代人溝通方式的差異,以及作者對於當面聊天的態度。他分享了與朋友蔡兄之間的聊天風格和分享的生活經歷。文章中,作者談到了人生觀、媒體對思維的影響以及生活中多樣化的觀點。同時也提到了生活中的抉擇和尊重。文章內涵豐富,提供了觀點和啟發,適合現代人重視自我發展和生活態度的思考。