Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 多个同时状态的建模_Language Agnostic_Design Patterns_Oop - Fatal编程技术网

Language agnostic 多个同时状态的建模

Language agnostic 多个同时状态的建模,language-agnostic,design-patterns,oop,Language Agnostic,Design Patterns,Oop,如何对具有多个同时状态的对象进行建模 例如,你可以有一个人在等公共汽车。那是一个州。但他们也可能在等公共汽车时看报纸。此外,他们在看报纸的时候可能在想些什么。他们也可能因为感冒而嗅鼻子。这是一个同时发生的四种状态。当概念是正交的(独立的)时,它们可以简单地建模为独立的值,例如 class Person { Location location; // bus stop, home etc... Motion motion; // sitting, walking, running

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


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

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

class Person
{
   Location location; // bus stop, home etc...
   Motion motion; // sitting, walking, running
   Topic thinkingAbout;
   boolean sniffing;
   boolean blinking;
   boolean breakingWind;
}
一个人可以同时做所有这些是合理的,因此没有限制。也就是说,他们可以在给定的位置(公共汽车站、家、工作)坐着/走路/跑步,他们可以同时思考某个话题,也可以同时嗅探、眨眼和做其他事情

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

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

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


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

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

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

如何为各州建模完全取决于你自己。上面是一个简单的例子,其中状态由字符串建模,不携带任何额外信息。

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

在您的例子中,您将有多个同时进行的进程,因此您的Person类将有一个DailyCommuteProcess、BodyClockProcess等的实例,每个实例都将处理相应的函数

这种方法(将作用于状态的状态和逻辑封装在单独的类中,而不是让消费类查看公共属性和行为)称为