文章目录
- 1.UML类图
- 2.状态基类
- 3.状态实现类
- 3.状态机管理类
- 使用示例
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);