2015-12-29 55 views
1

我有一個DependancyInject的結構問題。「託管」取決於「經理」結構

形勢

我正在創建一個基於體素的遊戲服務器;它完全調製,但相關模塊以下3

NetworkModule(發送和接收的數據包) WorldModule(句柄世界相關的事件並存儲世界) 世界(存儲所有的塊和有球員在名單世界) 塊(具有的材料,並且某些其他字段)

問題

當setMaterial(材料材料)方法被調用在塊類中,「BlockChange」分組應當被髮送所有的世界上的玩家讓客戶知道該塊已改變類型。要發送該數據包,Block類必須能夠訪問NetworkModule。在WorldModule內部存儲有一個NetworkModule的實例。從技術上講,這可以輕鬆解決,只需將WorldModule或NetworkModule傳遞到每個Block類。對我來說,這些響起警鐘,它將管理人員與管理人員聯繫起來,同時也節省了這個實例的空間。我覺得必須有更好的方式來做到這一點,以便他們不依賴彼此。

+0

實現靜態內存事件發佈。'Block'類將使用該靜態事件發佈者來發布'BlockChange'消息,另一部分軟件將監聽它並在網絡上重新發布它。 – plalx

回答

1

您是否考慮過在遊戲中添加「Message Bus」模塊?

基本上,你想在你的組件之間發送消息,而不是讓它們相互耦合。這是Mediator Pattern的目標。

您可以創建組件訂閱的主題以獲取狀態更新。您的組件也可以發佈此主題以通知其他組件其狀態已更改。

我不會在代碼的細節進入,因爲我沒有太多的時間,現在,但這裏有一些想法:

  • Mediator對象應持有一個映射,其關鍵字是「主題」和值是「用戶」
  • 每當一個消息被髮布在一個特定的主題,所有訂閱者應通知的名單
  • 你的組件,以接收來自更新將「訂閱」的Mediator的相關主題其他。
  • 您的組件應該知道您的Mediator。這應該是他們之間溝通的唯一手段。當組件狀態改變時,它應該通過發佈特定主題的消息來通知其他人(比如說「BlockChange」)。
  • 此消息不一定是純文本。它可能是一個適當的對象,包含所有相關數據,這些數據將允許其他組件知道這些變化。該消息甚至可以包含對已經改變的對象的引用。

這是一些常規的想法,讓我們來看看,如果你能得到的地方,從這裏...

+0

服務器本身使用我製作的這個事件系統,http://bit.ly/1TopBg8(一個全局靜態事件處理程序)和http://bit.ly/1OwKurn(主服務器類有一個這樣的實例)。我不知道爲什麼我沒有想到用它哈哈。非常感謝!我想我會盡可能採納你的建議並分開我的模塊,開始使用我的事件系統作爲中介,而不是外部模塊的更新海報。 – Exerosis