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等的实例,每个实例都将处理相应的函数 这种方法(将作用于状态的状态和逻辑封装在单独的类中,而不是让消费类查看公共属性和行为)称为