我必须开发一个使用大量网络请求来完成其任务的客户端/服务器游戏。
客户端和服务端都通过socket接收多个Command
。
为了处理这些命令,我创建了一个 NetworkHandler
类,它在单独的线程上监听新的 Input 并允许我发送新命令。
这些“命令”确实是异构的,并且由不同的类使用。
(例如,"client ready"命令
由 Main
服务器类使用,而 "client wants a card"
由游戏
类)。
所以我创建了一个 CommandDispatcher
类来监听 NetworkHandler
(可观察模式)并将不同的命令分派(dispatch)给正确的接收器。 (全部通过接口(interface))
问题是每个想要注册为“命令接收者”
的类都需要调用CommandDispatcher
将自己设置为监听器。
因为有多个类需要这个引用,所以我正在考虑将 CommandDispatcher
转换为一个可以在任何地方访问的单例类。
我知道 Singleton 和 global class 不好,我隐藏了一个依赖项,这将很难测试,但我看到的唯一选择是从 传递
类到所有其他类。CommandDispatcher
Main
你能帮我找到更好的解决方案吗? 谢谢。
编辑:我想澄清一下,我的应用是一款回合制游戏,因此我没有大量的并行请求。
最佳答案
这是一种常见模式,已在许多环境中多次解决。
您需要解决的主要问题是到达命令的发送速度。您必须确保任何命令都不会阻塞系统,否则您将获得不可预测的响应时间。为实现这一目标,您必须尽可能少地管理它的到来。
对此的经典解决方案是让您的网络监听器对命令执行最少的工作并将其交给队列。本质上,您应该只抓取到达的消息,将其放入队列中,然后返回收听。甚至不要对其进行反序列化,只需将其放入队列即可。
在队列的另一端,可以有一个或多个进程拉出命令,构建适当的对象并在它们上执行您想要的任何功能。这可能是您的听众应该聆听的地方。通常情况下,反序列化的对象将被分派(dispatch)到另一个合适的队列进行处理,因此您可能会在这些队列的另一端找到更合适的监听点。
网络监听器和命令处理器通常都可以用线程池来实现。
Is using a Observable Singleton Class to handle network calls bad?
不好吗?不——但它经不起高吞吐量。您最好取消网络监听器与命令调度程序的关联。
关于java - 使用 Observable 单例类来处理网络调用不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30231865/