这是一个设计问题,我将尽可能清楚地设计它,但我不确定该怎么称呼我所面临的问题。
我正在开发视频游戏,设置和玩游戏涉及多个步骤。我希望将这些步骤中的每一步都包含在某种对象中,以保持一切清洁。
我选择将游戏流分为会话,轮次和产卵。游戏的会话是最高范围级别,您配置哪些玩家是活动的(通过加入屏幕)然后继续开始一轮。您可以在一个会话中进行多轮,并且每轮中的每一轮都将继承全局会话数据。同样地,你可以在每一轮中死亡和重生多次,从轮次和会话中继承数据。
想象一些免费的。
Spawn 1可以访问Round B和Session 2中的数据。
这看起来很干净。我可以将会话范围的数据保存在一个地方,并在整个会话期间使该对象保持活动状态,每一轮分支并继承此数据。
现在有趣的问题。就像我之前说的那样,会话包含一系列玩家(加入游戏并在整个会话期间活跃的玩家)。圆形ALSO需要保留关于每个玩家的一些额外数据,但该数据仅存在于一轮(例如最后一个生成点或当前分数)内。我想按照相同的模式创建另一个类,它将保存这个特定于圆的数据。
这种情况发生在维护集合时。因为会话包含玩家的权威列表,并且每一轮提供额外的附加数据,该轮是否应该更新SessionPlayer的成员?轮次是否应该有自己的玩家列表,每个玩家都有圆形数据和指向会话级数据的指针?它们是否应包含具有匹配ID的单独集合?
这似乎可以通过巧妙的设计模式解决,但我找不到。
总结:如何临时包装包含集合的对象,同时包装该集合的所有元素?
我希望我能正确解释。谢谢你的帮助!
答案 0 :(得分:2)
首先回答你的最后一个问题:
总结:如何临时包装包含集合的对象,同时包装该集合的所有元素?
这可以通过Composite Design pattern实现,其中类包含自身的元素,类可以是独立的,也可以是容器。此类的操作将在其自身及其包含的每个元素上起作用。
关于您之前关于在何处存储玩家的问题,这有点困难,但在决定时您应该考虑以下问题:
如果绝对有必要使用这些双向引用,那么实现它的最佳方法可能是Dependency Injection。这将简化维护双向参考所涉及的典型问题。尝试只注入所需的最具体的实体,而不仅仅是整个根级对象,如Session。
答案 1 :(得分:0)
所以有SessionPlayer和RoundPlayer类。如何使RoundPlayer成为SessionPlayer的非静态成员类?这样,您可以维护2个不同的集合,1个用于Session,1个用于Round,RoundPlayer隐式地引用SessionPlayer。