【问题标题】:Design pattern for child calling method in parent父中子调用方法的设计模式
【发布时间】:2015-08-05 18:00:24
【问题描述】:

我目前正在处理我最大的项目,但我无法弄清楚如何构建我的代码。我正在寻找一些指导。

我有 2 个对象:TileContainer。每个 Tile 都有一个 2D 坐标,并且都是 Container 的子级。 Container 具有返回 tile 以获取位置、切换 tile、添加 tile 和删除 tile 的方法。

现在,当您单击某个图块时,它会消失,这很容易,因为它是自包含的。当我创建从基础 Tile 继承的不同类型的图块时,问题就出现了。当您单击它时,每种不同类型的磁贴都会执行不同的操作。一些破坏周围的瓷砖,一些与其他瓷砖切换,而另一些则添加新的瓷砖。为简单起见,我们将这 3 个子类称为 Tile-destroyTile-swapTile-add

我的问题是,当我单击这些图块时,它们如何作用于 Container 中的其他图块。我应该只调用父类中的函数还是有更好的方法来做到这一点?我遇到了麻烦#include TileContainer 以及其他方式。我觉得它不是一个合适的模式。

我已经设置好了,所以当点击发生时,Container 会处理它并检查点击的图块的类型,并使用一个大的 else-if 语句从那里开始操作,但这使它非常难以添加新的瓷砖类型。理想情况下,有关单击图块时发生的情况的所有信息都包含在每个图块子类中。

有什么想法吗?

【问题讨论】:

  • 根据你的语言,你的容器可能有包保护的方法,只能被瓦片访问(它们位于同一个包中)。然后容器只会将事件委托给磁贴,磁贴将持有对其容器的引用,从而允许操作其他磁贴。您将有两种方法来移除磁贴。一种是简单地删除磁贴,另一种是将删除操作委托给磁贴。因此,如果一个图块破坏了它的所有邻居,并且被破坏的图块中的一个应该破坏它的正确邻居,这一切都会发生,
  • 除非第一个被破坏的瓦片覆盖了兄弟瓦片的破坏。这对你有意义吗?
  • 我正在使用 Objective-C。我正在尝试阅读更多关于委托包保护方法是不可能的。您是说破坏周围瓷砖的方法是在瓷砖中并将其传递给容器吗?对不起,我还是有点困惑。
  • 是的,容器提供了细粒度的方法来销毁瓦片、添加瓦片等,但这些方法是直接从瓦片调用的。例如。点击时瓦片破坏兄弟瓦片...user clicks on tile -> container.handleClick(tilePosition) -> tile.handleClick() -> container.destroySiblingsOf(this)它可能会有所不同,但这是双重调度的本质。
  • 你还想控制被破坏的兄弟姐妹是否也应该踢他们的破坏逻辑。那可能是不同的方法,例如destroySiblingOfWithoutPropagation vs destroySiblingsOf.

标签: oop design-patterns


【解决方案1】:

我可以建议你最简单的设计:

  1. 您的容器将成为游戏控制器
  2. 每个 tile 都有 Parent 属性,指的是 Container
  3. 当您单击磁贴时,它会向容器发送命令(例如,DestroyTile(x, y) 或 AddTile(x, y)
  4. 容器处理此命令并销毁、添加或交换图块。

如果您想要真正好的和更解耦的设计,您还可以为所有操作类型 DestroyTileHandler、AddTileHandler 创建处理程序。在不同命令的容器中,您只需将它们 [commands] 传递给适当的处理程序。此外,您还需要将上下文对象(如带图块的字段)传递给处理程序。这允许您添加和修改新操作,甚至无需更改容器代码。

查看相关模式:命令、观察者

欢迎提问,祝你好运!

【讨论】:

    猜你喜欢
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多