【问题标题】:Modelling multiple simultaneous states建模多个同时状态
【发布时间】:2010-06-13 00:47:01
【问题描述】:

如何对可以同时具有多个状态的对象进行建模?

例如,您可能有一个人在等公共汽车。那是一种状态。但他们也可能在等公共汽车时正在看报纸。此外,他们可能在阅读报纸时正在思考一些事情。他们也可能因为感冒而闻鼻子。这是同时发生的四种状态。

【问题讨论】:

    标签: language-agnostic design-patterns oop


    【解决方案1】:

    状态通常只是过程中的步骤。与其将它们表示为值,不如将流程本身表示为一个类,并让它决定应该做什么,而不仅仅是告诉它处于什么状态。

    在您的情况下,您将有多个同时进行的进程,因此您的 Person 类将具有 DailyCommuteProcess、BodyClockProcess 等实例,每个实例都将负责相应的功能。

    这种方法(将状态和作用于状态的逻辑封装在单独的类中,而不是让消费类查看公共属性并采取行动),称为Tell, Don't Ask principle.

    【讨论】:

      【解决方案2】:

      使用数组存储对象当前所处的所有状态。

      MrBean.states = {
          "WaitingForBus",
          "ReadingNewspaper",
          "Sniffling",
          "ThinkingAboutPaintings"
      };
      

      如何对状态进行建模完全取决于您。上面是一个简单的例子,状态由字符串建模,并且携带零额外信息。

      【讨论】:

        【解决方案3】:

        当概念是正交的(独立的)时,它们可以简单地建模为独立的值,例如

        class Person
        {
           Location location; // bus stop, home etc...
           Motion motion; // sitting, walking, running
           Topic thinkingAbout;
           boolean sniffing;
           boolean blinking;
           boolean breakingWind;
        }
        

        一个人可以一次完成所有这些是合理的,因此没有任何限制。也就是说,他们可以在给定的位置(公共汽车站、家、工作)坐着/走路/跑步,他们可以同时思考某个话题,也可以同时嗅探、眨眼和做其他事情时间。

        每个子状态本身都是排他性的——一个人只能在一个地方,有一种动作,想一件事。

        当存在约束时,可以使用相同的模型,但要结合验证框架来确保状态有效。

        例如,如果我们添加了“布尔打喷嚏”。如果打喷嚏是真的,那么眨眼也应该是真的,因为打喷嚏时不可能睁着眼睛。验证模型将对这个约束进行编码。

        从状态的角度考虑,通过取每个子状态的笛卡尔积,可以将独立值集体建模为单个状态。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-08-16
          • 2021-11-29
          • 1970-01-01
          • 2021-03-19
          • 2019-05-05
          • 2021-12-20
          • 1970-01-01
          相关资源
          最近更新 更多