Design Pattern: Behavioral Patterns — Mediator Pattern(中介/協調者模式)

Charlie Lee
Bucketing
Published in
Oct 29, 2020

MMORPG和聊天室如何實踐玩家互相溝通的? 你應該來看看這篇Mediator Pattern文章,一探究竟

Photo by Mark Stenglein on Unsplash

前言

中介/協調者模式,以生活舉例就像是飛機場的航空指揮站,負責調度飛機飛往哪個航道在哪起飛,如果沒有了航空指揮站,飛機就必須個別溝通,個別溝通的成本非常高,需知道有哪些飛機要再這機場降落和起飛,更別說一個一個互相溝通了。但是只要有了航空台,就可以簡單的傳遞訊息給航空指揮站,並且依據航空指揮站的調度前進。

以軟體的例子,MMORPG (Massively Multiplayer Online Role-Playing Game)或是簡單的聊天室,中介/協調者物件可以被動的接收玩家或使用著的訊息,再依據自己的業務邏輯傳遞,可以避免玩家之間要互相維護彼此的物件。

類別圖

協調者模式非常簡單,只需要將需要協同運作的物件們與協調者物件相互關連即可,而協調者物件需要維護和自己關聯的協同運作物件,可能用Map或是List容器管理。

範例程式碼

範例程式碼模擬MMORPG玩家互相傳送訊息情境,包含兩個介面與兩個實作物件

  • Room: Mediator Object 協調者介面
  • User: Colleague 協同運作介面
  • HeroGameRoom: 實作介面邏輯,其中包含了User List維護加入遊戲的玩家物件
  • GameUser: 實作介面邏輯,其中包含了Channel物件,用於做真正的網路傳輸(可能是Websocket或是Netty的Channel),將訊息傳到客戶端

程式碼邏輯主要實踐玩家可以廣播給其他玩家,以及互相私訊,玩家彼此之間不在需要互相維護彼此資料,只要將業務邏輯都封裝在HeroGameRoom這個協調者物件即可

原始碼連結

優點

可以解偶需要大量協同運作的物件,將互動邏輯包裝在Mediator物件之中,可以更好維護程式碼與擴增功能。

缺點

Mediator物件因為包含了大量互動邏輯,所以可能會變得非常肥大,程式碼若是沒有持續迭代重購,那會非常恐怖。

結論

  • 當有大量物件需要互動時可以考慮使用Mediator Pattern設計
  • 在擴充Mediator物件時,記得要持續迭代重構,不然有機會變成恐怖的破千行超巨肥大物件
  • MurMur: 在台灣成為博弈代工島的時代,博奕遊戲(MMORPG)的玩家互動控管基本上都是透過Mediator Pattern去實踐,或許有興趣進入產業的讀者們可以先感受一下Mediator的威力

--

--