【问题标题】:How to elegantly change the program's behavior at runtime?如何优雅地改变程序在运行时的行为?
【发布时间】:2018-09-03 09:05:24
【问题描述】:

我正在用 Kotlin 编写一个 Android 游戏,其中棋盘会根据特定模式发生变化 - 哪种模式取决于用户当前玩的关卡。

我需要一种方法来在我的代码中使用许多不同的模式(最多 20、30 个),决定在运行时使用其中的哪一个。

我想将每个模式编码为一个字符串,将所有这些字符串放在一个文件中,并在运行时加载它并解析所需的字符串。但是,模式并不是那么简单,因此解析将是一个复杂的过程。这似乎也过于复杂了。

我现在最好的想法是为每个不同的模式编写一个类(以及一个供调用实体使用的公共父抽象类)。每个类都有一个“应用”方法,用于在板上应用该特定模式。

但是,这意味着几十个类(我可以将它们放在不同的文件夹中,这样它们就不会使主代码文件夹过于拥挤),以及一个映射模式 id 的大开关盒(从关卡管理器收到)到具体实施。我很确定我不想那样。

有更好的想法吗?提前致谢。

【问题讨论】:

    标签: android oop strategy-pattern


    【解决方案1】:

    这取决于将来会发生什么。会有更多的模式吗?他们有共同的部分吗?会不会有其他规则,比如如果你用过模式1,那么你下次就不能再去模式1了,以此类推?

    无论哪种方式,您都会有十几种模式。将它们存储为字符串、对象、文件、模型或任何完全取决于您的东西,但您不会逃避拥有它们。我的意思是拥有 1 个具有 20 个模式的文件与拥有 20 个每个具有 1 个模式的文件没有太大区别。所以不,在这种情况下,拥有很多类并不是什么问题。

    将它们放在一个文件夹中并创建一个外观。这样,您使用它们所需要做的就是调用外观并根据某些条件(模式 id)获取应用方法:

    外观本身既可以将 id 映射到行为,也可以直接检查文件夹中是否有以这种方式命名的文件(类)。如果有一个,它将获取它的实例并调用它的 apply 方法作为结果。您可以这样存储实例:

    优点:

    • 可以随时更改,行为也会改变

    • 将只有 1 种方式来呈现模式(没有选项可以让 2 种模式尝试自己绘制)

    缺点:

    • 如果某些模式在某些时候需要另一种方法,则需要更改所有类和外观

    这样您就不需要切换,如果出现新模式,也无需更改外观本身 - 只需创建具有自己实现的新文件,您就可以开始了。

    【讨论】:

      【解决方案2】:

      这个问题对于 SO 来说并不是那么理想,但是,我发现它真的很有趣。因此,如果我必须设计这样的游戏,我会提出我的一些想法。

      这是一个基于关卡的游戏,在不同的关卡中会产生不同的棋盘图案。因此,如何设计模式以将其转换为电路板非常重要。您的模式可能有一些通用关键字,可以将其翻译成程序以逐部分创建电路板。让我们看一个例子,以使想法更清晰。

      假设,您正在建造一条管道。每个部分都与已经构建的管道连接。你手里可能有很多不同形状的管子。因此,在构建模式时,您只需命名每个形状。例如,left-round-vertical-up、right-round-vertical-up、straight-horizo​​ntal、straight-vertical 等。你有一个Factory 类,它知道每个形状的实现。现在将整个模式存储在本地数据库表中非常简单。根据您的 Factory 类的逻辑,它将在运行时翻译到您的板上。

      您的数据库表中的示例行可能如下所示。

      id      level_number     level_passed    pattern_desc
      --      ------------     ------------    ------------
      1            1                1          left-round-vertical-up, straight-horizontal, straight-vertical, right-round-vertical-up
      2            1                0          straight-horizontal, straight-vertical, right-round-vertical-up
      

      因此,当您在数据库中拥有上述结构中的数据并且您知道要在板中翻译的管段的所有关键字时,您可以更轻松地维护代码并通过 API 调用添加新模式。

      在您当前的结构中,如果没有任何应用程序更新,很难更新您的模式。但是,在建议的架构中,您可以使用来自服务器的简单 API 调用轻松添加不同级别的新模式。应用程序知道如何解析模式并可以相应地显示它们。然后你的工作是调用一个 API 从你的服务器获取新引入的模式并将它们插入到你的表中以存储具有适当值的模式。

      factory implementation 可能需要许多类,这些类表示管段的每种形状。但是,您并没有为每个模式编写类,这非常多且难以进一步管理。

      希望有帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-12
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 2020-03-13
        • 2017-10-25
        • 1970-01-01
        • 2013-02-14
        相关资源
        最近更新 更多