Stateless 是一个 C# 库,它可以帮助我们简化状态机的实现。下面是使用 Stateless 实现一个简单的状态机的示例:
Copy
using System;
using Stateless;
public enum TrafficLightState { Green, Yellow, Red }
public enum TrafficLightTrigger { TimerElapsed, CarDetected }
public class TrafficLight
{
private readonly StateMachine<TrafficLightState, TrafficLightTrigger> _stateMachine;
public TrafficLight()
{
_stateMachine = new StateMachine<TrafficLightState, TrafficLightTrigger>(TrafficLightState.Green);
_stateMachine.Configure(TrafficLightState.Green)
.Permit(TrafficLightTrigger.TimerElapsed, TrafficLightState.Yellow);
_stateMachine.Configure(TrafficLightState.Yellow)
.Permit(TrafficLightTrigger.TimerElapsed, TrafficLightState.Red)
.Permit(TrafficLightTrigger.CarDetected, TrafficLightState.Red);
_stateMachine.Configure(TrafficLightState.Red)
.Permit(TrafficLightTrigger.TimerElapsed, TrafficLightState.Green)
.Permit(TrafficLightTrigger.CarDetected, TrafficLightState.Green);
}
public void Trigger(TrafficLightTrigger trigger)
{
_stateMachine.Fire(trigger);
Console.WriteLine($"Traffic light state: {_stateMachine.State}");
}
}
class Program
{
static void Main(string[] args)
{
var trafficLight = new TrafficLight();
trafficLight.Trigger(TrafficLightTrigger.TimerElapsed);
trafficLight.Trigger(TrafficLightTrigger.CarDetected);
trafficLight.Trigger(TrafficLightTrigger.TimerElapsed);
trafficLight.Trigger(TrafficLightTrigger.TimerElapsed);
}
}
在上面的示例中,我们定义了一个 TrafficLight 类,它有三个状态:Green、Yellow 和 Red。我们使用 StateMachine 类创建了一个状态机,并在每个状态中定义了可能的转换。我们还定义了两个触发器:TimerElapsed 和 CarDetected。最后,我们在程序的 Main 方法中创建了一个 TrafficLight 实例,并使用 Trigger 方法触发状态机的转换。
当我们运行这个程序时,它会输出当前的交通灯状态。输出如下:
Copy
Traffic light state: Yellow
Traffic light state: Red
Traffic light state: Green
Traffic light state: Yellow
这个程序模拟了一个交通灯的状态机。当交通灯为绿色时,它会在一定时间后变成黄色,然后变成红色。当交通灯为黄色时,它会在一定时间后变成红色,或者当有车辆通过时,立即变成红色。当交通灯为红色时,它会在一定时间后变成绿色,或者当有车辆通过时,立即变成绿色。