Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;管理的;取决于;经理;结构_Java_Design Patterns_Structure - Fatal编程技术网

Java &引用;管理的;取决于;经理;结构

Java &引用;管理的;取决于;经理;结构,java,design-patterns,structure,Java,Design Patterns,Structure,我的DependancyInject存在结构问题 形势 我正在为基于体素的游戏创建服务器;它是完全调制的,但相关模块如下3所示 网络模块(发送和接收数据包) WorldModule(处理世界相关事件并存储世界) 世界(存储所有区块,并有世界上的玩家列表) 块(具有材质和一些其他字段) 问题 当在Block类中调用setMaterial(Material Material)方法时,应该向世界上所有的玩家发送一个“BlockChange”数据包,让客户端知道Block已经改变了类型。要发送该数据包,

我的DependancyInject存在结构问题

形势

我正在为基于体素的游戏创建服务器;它是完全调制的,但相关模块如下3所示

网络模块(发送和接收数据包) WorldModule(处理世界相关事件并存储世界) 世界(存储所有区块,并有世界上的玩家列表) 块(具有材质和一些其他字段)

问题


当在Block类中调用setMaterial(Material Material)方法时,应该向世界上所有的玩家发送一个“BlockChange”数据包,让客户端知道Block已经改变了类型。要发送该数据包,Block类必须能够访问NetworkModule。WorldModule中存储有NetworkModule的实例。从技术上讲,这很容易解决,只需将WorldModule或NetworkModule传递到每个块类中。对我来说,这敲响了警钟,它将管理者与被管理者联系在一起,而且还浪费了节省实例的空间。我觉得必须有更好的方法来做到这一点,这样他们就不会相互依赖。

您是否考虑过在游戏中添加“消息总线”模块

基本上,您希望在组件之间发送消息,而不是让它们彼此耦合。这是本次会议的目的

您可以创建组件订阅的主题,以获取状态更新。您的组件也可以发布到此主题,以通知其他组件其状态已更改

我不会详细介绍代码,因为我现在没有太多时间,但这里有一些想法:

  • 您的
    Mediator
    对象应该包含一个映射,其键是“主题”,值是“订阅者”列表
  • 每当在特定主题中发布消息时,应通知所有订阅者
  • 您的组件将“订阅”中介的相关主题,以便从其他组件接收更新
  • 您的组件应该知道您的
    中介
    。这应该是他们之间唯一的沟通方式。当组件状态更改时,它应该通过发布关于特定主题的消息(比如“BlockChange”)来通知其他组件
  • 此消息不一定是纯文本。它可以是一个适当的对象,包含所有相关的数据,这些数据将允许其他组件知道这些更改。此消息甚至可能包含对已更改自身的对象的引用

这是一些一般性的想法,让我们看看您是否可以从这里获得一些东西…

实现一个静态内存中事件发布器。
Block
类将使用该静态事件发布器发布
BlockChange
消息,软件的另一部分将侦听该消息并在网络上重新发布。服务器本身确实使用我制作的此事件系统(全局静态事件处理程序)和(主服务器类有此事件的实例)。我不知道为什么我没有想到使用它哈哈。多谢各位!我想我会采纳你的建议,尽可能地分离我的模块,开始使用我的事件系统作为中介,而不是外部模块的更新海报。