如何建模可以同时具有多个状态的对象?
例如,你可能有一个人在等公共汽车。这是一个州。但他们也可以在等公共汽车的同时阅读报纸。此外,他们在阅读报纸时可能会想到什么。他们也可能因为感冒而嗅鼻子。这是同时发生的四个州。
答案 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"
};
你如何建模状态完全取决于你。以上是一个简单的例子,其中状态由字符串建模,并且携带零额外信息。