Tag: 有限状态机

状态模式使用方法

我正在尝试使用方法作为状态而不是类来实现基于状态模式的修改版本的简单状态机,如下所示: private Action currentState; private void NextState(Input i) { currentState(i); } private void State1(Input i) { if( i … ) currentState = State1; else currentState = State2; } private void State2(Input i) { if( i … ) currentState = State1; else currentState = State2; } 但如果我能这样做会更优雅: private void NextState(Input i) { currentState = currentState(i); } […]

如何从bbv.Common.StateMachine(现在的Appccelerate.StateMachine)类中获取当前状态?

bbv.Common.StateMachine类是我见过的最好的状态机代码。 但它只缺少一件事:获得当前状态。 这是一个订单跟踪系统: fsm = new ActiveStateMachine(); fsm.In(States.OrderCreated) .On(Events.Submitted) .Goto(States.WaitingForApproval); fsm.In(States.WaitingForApproval) .On(Events.Reject) .Goto(States.Rejected); fsm.In(States.WaitingForApproval) .On(Events.Approve) .Goto(States.BeingProcessed); fsm.In(States.BeingProcessed) .On(Events.ProcessFinished) .Goto(States.SentByMail); fsm.In(States.SentByMail) .On(Events.Deliver) .Goto(States.Delivered); fsm.Initialize(States.OrderCreated); fsm.Start(); fsm.Fire(Events.Submitted); // Save this state to database 你可以很容易地看到它的工作原理。 但我想在数据库中保存订单状态。 所以我将能够显示订单的状态。 我需要一个 fsm.GetCurrentState() //show this state in the a table 方法。 实际上有一种方法:我可以使用ExecuteOnEntry并在每个州的条目上更改本地值。 但是为每个州编写ExecuteOnEntry会很麻烦,因为我会重复自己! 必须有一种微妙的方式来做到这一点。