1.UML类图
2.状态基类
public abstract class State
{
public string? Name { get; set; }
public StateMachine? StateMachine {get; set;}
public abstract void Exit();
public abstract void Enter();
}
3.状态实现类
- StateA
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
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
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.状态机管理类
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();
}
}
使用示例
StateMachine stateMachine = new StateMachine("状态模式测试");
stateMachine.AddState(new StateA("状态A"));
StateB stateB = new StateB("状态B");
stateMachine.AddState(stateB);
stateMachine.AddState(new StateC("状态C"));
stateMachine.Switch2NextState();
stateMachine.Switch2NextState();
stateMachine.Switch2NextState();
stateMachine.Switch2PreviousState();
stateMachine.Switch2PreviousState();
stateMachine.ChangeState(stateB);