Máy chỉ ở một trạng thái tại một thời điểm; trạng thái tại thời điểm bất kỳ được gọi là trạng thái hiện tại. Nó có thể thay đổi từ một trạng thái sang một trạng thái khác khi được bắt đầu bởi sự kiện kích hoạt hoặc điều kiện, đây là được gọi là chuyển đổi. from Finite-state machine on Wiki
Tôi tin rằng, cò là này kích hoạt sự kiện.
Cập nhật:
Trong số tên cò nhiên đôi khi có thể tương đương với một số tên tuổi nhà nước.
New (initial state)
New -> Filled (trigger "Filled")
New -> Cancelled (trigger "Cancelled")
Filled -> Shipping (trigger "ToBeShipped")
Filled -> Cancelled (trigger "Cancelled")
Shipping -> Complete (trigger "Completed").
Cập nhật:
stateless là khuôn khổ thực sự tốt đẹp! Tôi đã cố triển khai chức năng này.
Hoa:
public enum State
{
New,
Filled,
Shipping,
Cancelled,
Completed
}
Triggers:
public enum Trigger
{
Filled,
Cancelled,
ToBeShipped,
Completed
}
lớp theo thứ tự:
public class Order
{
private readonly StateMachine<State, Trigger> _stateMachine;
public Order()
{
_stateMachine = CreateStateMachine();
}
public bool TryUpdateOrderStatus(Trigger trigger)
{
if (!_stateMachine.CanFire(trigger))
return false;
_stateMachine.Fire(trigger);
return true;
}
public State Status
{
get
{
return _stateMachine.State;
}
}
private StateMachine<State, Trigger> CreateStateMachine()
{
StateMachine<State, Trigger> stateMachine = new StateMachine<State, Trigger>(State.New);
stateMachine.Configure(State.New)
.Permit(Trigger.Filled, State.Filled)
.Permit(Trigger.Cancelled, State.Cancelled);
stateMachine.Configure(State.Filled)
.Permit(Trigger.ToBeShipped, State.Shipping)
.Permit(Trigger.Cancelled, State.Cancelled);
stateMachine.Configure(State.Shipping)
.Permit(Trigger.Completed, State.Completed);
stateMachine.OnUnhandledTrigger((state, trigger) =>
{
Console.WriteLine("Unhandled: '{0}' state, '{1}' trigger!");
});
return stateMachine;
}
}
Tester cho các lớp học theo thứ tự:
Order order = new Order();
bool result = order.TryUpdateOrderStatus(Trigger.Completed);
Console.WriteLine("Attemp to complete order: {0}", result);
Console.WriteLine("Order status: {0}", order.Status);
result = order.TryUpdateOrderStatus(Trigger.ToBeShipped);
Console.WriteLine("Attemp to ship order: {0}", result);
Console.WriteLine("Order status: {0}", order.Status);
result = order.TryUpdateOrderStatus(Trigger.Cancelled);
Console.WriteLine("Attemp to cancel order: {0}", result);
Console.WriteLine("Order status: {0}", order.Status);
Cảm ơn bạn đã đào bới Stateless, tôi chưa từng thấy điều đó trước đây. – kenny