public abstract class State
{
public string? Name { get; set; }
public StateMachine? StateMachine {get; set;}
public abstract void Exit();
public abstract void Enter();
}
3.状态实现类
StateA
csharp复制代码
public class StateA : State
{
public StateA(string name)
{
Name = name;
}
public override void Enter()
{
Console.WriteLine("进入状态A,Name:{0}", Name);
}
public override void Exit()
{
Console.WriteLine("退出状态A,Name:{0}", Name);
}
}
StateB
csharp复制代码
public class StateB : State
{
public StateB(string name)
{
Name = name;
}
public override void Enter()
{
Console.WriteLine("进入状态B,Name:{0}", Name);
}
public override void Exit()
{
Console.WriteLine("退出状态B,Name:{0}", Name);
}
}
StateC
csharp复制代码
public class StateC : State
{
public StateC(string name)
{
Name = name;
}
public override void Enter()
{
Console.WriteLine("进入状态C,Name:{0}", Name);
}
public override void Exit()
{
Console.WriteLine("退出状态C,Name:{0}", Name);
}
}
3.状态机管理类
csharp复制代码
public class StateMachine
{
public string? Name {get; set;}
private List<State> states = new List<State>();
private State? CurrentState;
public StateMachine(string name)
{
Name = name;
}
public void AddState(State state)
{
if (!states.Contains(state))
{
states.Add(state);
state.StateMachine = this;
}
}
public void RemoveState(State state)
{
if (states.IndexOf(state) == -1)
return;
state.Exit();
CurrentState = null;
states.Remove(state);
}
public void ChangeState(State state)
{
CurrentState?.Exit();
CurrentState = state;
CurrentState.Enter();
}
public void Switch2NextState()
{
if (CurrentState != null)
{
int index = states.IndexOf(CurrentState);
// 排除状态不存在和最后一个状态的情况
if (index == -1)
return;
if (index + 1 >= states.Count)
return;
CurrentState.Exit();
CurrentState = states[index + 1];
}
else // 当前状态为空 则直接进入列表中的第一个状态
{
CurrentState = states[0];
}
CurrentState.Enter();
}
public void Switch2PreviousState()
{
if (CurrentState != null)
{
int index = states.IndexOf(CurrentState);
// 排除状态不存在和第一个状态的情况
if (index == -1)
return;
if (index == 0)
return;
CurrentState.Exit();
CurrentState = states[index - 1];
}
else // 当前状态为空 则直接进入列表中的最后一个状态
{
CurrentState = states[states.Count - 1];
}
CurrentState.Enter();
}
}