开源库
需求
近期我正在开发一个上位机程序。由于流程变得相当复杂,导致了大量的if逻辑判断,使代码变得混乱且难以维护。考虑到这个问题,我计划引入状态机来简化整个流程,提高代码的可维护性。通过使用状态机,我希望能够更清晰地表达程序的状态变化,减少条件判断的数量,使代码更加简洁和易于理解。
For example
举例:下发
状态枚举
开始 下发 完成
public enum State
{
Start,
Down,
Complete
}
触发枚举
异常 正常
public enum Trigger
{
Normal,
Abnormal
}
状态机类
public class MyStateMachine
{
private readonly StateMachine<State, Trigger> stateMachine;
public MyStateMachine()
{
stateMachine = new StateMachine<State, Trigger>(State.Start);
// 状态:开始
stateMachine.Configure(State.Start)
.PermitIf(Trigger.Normal, State.Down,() => ShouldTransitionToComplete())
.Permit(Trigger.Normal, State.Down) // 触发正常,走下一个流程
.Ignore(Trigger.Abnormal); // 忽略异常情况
// 状态:下发
stateMachine.Configure(State.Down)
// 触发正常,走下一个流程
// () => ShouldTransitionToComplete(): Function that must return true in order for the trigger to be accepted.
.PermitIf(Trigger.Normal, State.Complete, () => ShouldTransitionToComplete())
// 触发异常,返回上一个流程
// () => ShouldTransitionToStart(): Function that must return true in order for the trigger to be accepted.
.PermitIf(Trigger.Abnormal, State.Start, () => ShouldTransitionToStart());
.Ignore(Trigger.Restart);
stateMachine.Configure(State.Complete)
.PermitIf(Trigger.Restart, State.Start,() => ShouldTransitionToStart())
.Ignore(Trigger.Normal) // 忽略正常情况
.Ignore(Trigger.Abnormal); // 忽略异常情况
}
// 正常
private bool ShouldTransitionToComplete()
{
// 添加根据条件的逻辑
MessageBox.Show("下一步");
return true;
}
// 异常
private bool ShouldTransitionToStart()
{
// 添加根据条件的逻辑
MessageBox.Show("请重新开始");
return true;
}
// 触发状态机的方法
public void TriggerState(Trigger trigger)
{
stateMachine.Fire(trigger);
}
// 获取当前状态的方法
public State GetCurrentState()
{
return stateMachine.State;
}
Winform测试
按键
private void button1_Click(object sender, EventArgs e)
{
myStateMachine.TriggerState((MyStateMachine.Trigger)Trigger.Normal);
}
private void button2_Click(object sender, EventArgs e)
{
myStateMachine.TriggerState((MyStateMachine.Trigger)Trigger.Abnormal);
}
private void button1_Click_1(object sender, EventArgs e)
{
myStateMachine.TriggerState((MyStateMachine.Trigger)Trigger.Restart);
}
显示
private void Form1_Load(object sender, EventArgs e)
{
// 省略其他代码...
// 在Form1加载时订阅Form2的事件处理程序
//ParentValueChanged += form2.ParentFormValueChangedHandler;
// 启动Task更新UI
Task.Run(() =>
{
while (true)
{
this.Invoke(() =>
{
// 在UI线程中更新UI
// 可以在这里进行一些其他的UI更新操作
this.label1.Text = myStateMachine.GetCurrentState().ToString();
});
}
});
}