建模多个同时状态

时间:2010-06-13 00:47:01

标签: language-agnostic design-patterns oop

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

例如,你可能有一个人在等公共汽车。这是一个州。但他们也可以在等公共汽车的同时阅读报纸。此外,他们在阅读报纸时可能会想到什么。他们也可能因为感冒而嗅鼻子。这是同时发生的四个州。

3 个答案:

答案 0 :(得分:2)

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

在您的情况下,您将同时进行多个进程,因此您的Person类将具有DailyCommuteProcess,BodyClockProcess等实例,每个实例都将处理相应的函数。

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

答案 1 :(得分:1)

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

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

一个人可以同时做所有这些是合理的,所以没有限制。也就是说,他们可以在一个给定的位置(公共汽车站,家里,工作)坐着/走路/跑步,他们可以同时思考一些话题,也可以嗅闻,眨眼,做同样的事情。时间。

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

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

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

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

答案 2 :(得分:1)

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

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

你如何建模状态完全取决于你。以上是一个简单的例子,其中状态由字符串建模,并且携带零额外信息。