具有无国籍的分层状态

时间:2017-06-22 08:11:31

标签: stateless-state-machine

我想知道它是否能完成我的目标。

我正在考虑一个家庭自动化的状态机,其逻辑与此类似:

var stateMachine = new StateMachine<State, Trigger>(State.UnOccupied);
        stateMachine.Configure(State.UnOccupied)
            .Permit(Trigger.SensorActivity, State.Occupied)
            .Ignore(Trigger.AlarmFullSet);

        stateMachine.Configure(State.Occupied)
            .Permit(Trigger.AlarmFullSet, State.UnOccupied)
            .Permit(Trigger.AlarmPartSet, State.Asleep)
            .PermitReentry(Trigger.SensorActivity);

        stateMachine.Configure(State.Asleep)
            .SubstateOf(State.Occupied)
            .Permit(Trigger.AlarmUnset, State.Occupied);

然而,我想表示房屋内的房间状况以及房屋的整体状况..

IE

Home

    House Object
                        Upstairs
                                        Bedroom 1
                                        Bedroom 2
                        Downstairs
                                        Kitchen
                                        Living Room

    Garden
                        Front
                        Back
                        Side                       

所以,如果客厅被占用,那么楼下,房子和房屋也是如此。

提前道歉我的C#并不是最好的,而且我正把自己投入到最深处!

也可以定时离开状态..所以传感器可以触发一个房间被占用,然后更多的活动触发'重入?'(重新启动计数器/定时器/调整时间表)在一个被占用的状态条目上 - 然后在没有更多进入/活动事件的15分钟之后,该区域的占用率将被清除,并且状态将转变为该区域未被占用。

1 个答案:

答案 0 :(得分:0)

是的,我认为可以使用无状态存档。 我会将每个房间建模为一个Room对象,它有一组触发器和状态。 Room对象可以有一个或多个计时器来处理计划的触发器,这会在计时器到期时触发触发器。有些房间可能很特别,因此可以将它们建模为从Room类继承的专用类。如果有意义,甚至可以创建Floor和House对象。然后你可以做house.SetVacationMode()。

Stateless有一个StateChanged事件,您可以使用它来让每个房间了解其他房间的状态。我怀疑你需要一个与UI接口的管理器对象,以及一个UI / Control对象。这些也可能有状态机。