包装收集元素

时间:2012-06-24 19:54:30

标签: oop design-patterns

这是一个设计问题,我将尽可能清楚地设计它,但我不确定该怎么称呼我所面临的问题。

我正在开发视频游戏,设置和玩游戏涉及多个步骤。我希望将这些步骤中的每一步都包含在某种对象中,以保持一切清洁。

我选择将游戏流分为会话,轮次和产卵。游戏的会话是最高范围级别,您配置哪些玩家是活动的(通过加入屏幕)然后继续开始一轮。您可以在一个会话中进行多轮,并且每轮中的每一轮都将继承全局会话数据。同样地,你可以在每一轮中死亡和重生多次,从轮次和会话中继承数据。

想象一些免费的。

  • 第1节
  • 第二节
    • Round A
    • 回合B
      • Spawn 1
      • Spawn 2
    • Round C
  • 第3节

Spawn 1可以访问Round B和Session 2中的数据。

这看起来很干净。我可以将会话范围的数据保存在一个地方,并在整个会话期间使该对象保持活动状态,每一轮分支并继承此数据。

现在有趣的问题。就像我之前说的那样,会话包含一系列玩家(加入游戏并在整个会话期间活跃的玩家)。圆形ALSO需要保留关于每个玩家的一些额外数据,但该数据仅存在于一轮(例如最后一个生成点或当前分数)内。我想按照相同的模式创建另一个类,它将保存这个特定于圆的数据。

这种情况发生在维护集合时。因为会话包含玩家的权威列表,并且每一轮提供额外的附加数据,该轮是否应该更新SessionPlayer的成员?轮次是否应该有自己的玩家列表,每个玩家都有圆形数据和指向会话级数据的指针?它们是否应包含具有匹配ID的单独集合?

这似乎可以通过巧妙的设计模式解决,但我找不到。

总结:如何临时包装包含集合的对象,同时包装该集合的所有元素?

我希望我能正确解释。谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

首先回答你的最后一个问题:

  

总结:如何临时包装包含集合的对象,同时包装该集合的所有元素?

这可以通过Composite Design pattern实现,其中类包含自身的元素,类可以是独立的,也可以是容器。此类的操作将在其自身及其包含的每个元素上起作用。

关于您之前关于在何处存储玩家的问题,这有点困难,但在决定时您应该考虑以下问题:

  • 玩家数据确实应该都在一个地方。如果你将它的所有权分成不同的对象,这是一个混乱的设计,很难维护。
  • 尽量避免在依赖关系层次结构(Session,Round,Spawn)中来回使用指针/引用,因为这样可以真正快速地实现复杂化,并且它将不再是依赖关系层次结构,而是交织在一起的混乱类的混乱非常高的耦合。
  • 如果依赖关系层次结构的所有级别都需要播放器数据,那么它应该包含在某个有意义的地方,并且可以被层次结构的所有级别轻松访问。如果是这种情况,您还应该考虑问自己,所有级别是否真的有必要了解玩家数据。

如果绝对有必要使用这些双向引用,那么实现它的最佳方法可能是Dependency Injection。这将简化维护双向参考所涉及的典型问题。尝试只注入所需的最具体的实体,而不仅仅是整个根级对象,如Session。

答案 1 :(得分:0)

所以有SessionPlayer和RoundPlayer类。如何使RoundPlayer成为SessionPlayer的非静态成员类?这样,您可以维护2个不同的集合,1个用于Session,1个用于Round,RoundPlayer隐式地引用SessionPlayer。