状态模式

文章目录

1.UML类图

2.状态基类

csharp 复制代码
public abstract class State 
{
    public string? Name { get; set; }
    public StateMachine? StateMachine {get; set;}
    public abstract void Exit();
    public abstract void Enter();
}

3.状态实现类

  1. 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);
    }
}
  1. 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);
    }  
}
  1. 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();
    }
}  

使用示例

csharp 复制代码
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);

/*
进入状态A,Name:状态A
退出状态A,Name:状态A
进入状态B,Name:状态B
退出状态B,Name:状态B
进入状态C,Name:状态C
退出状态C,Name:状态C
进入状态B,Name:状态B
退出状态B,Name:状态B
进入状态A,Name:状态A
退出状态A,Name:状态A
进入状态B,Name:状态B
*/
相关推荐
唐宋元明清21881 小时前
.NET Win32磁盘动态卷/跨区卷触发“函数不正确”问题排查
windows·c#·存储
hez20102 小时前
Satori GC:同时做到高吞吐、低延时和低内存占用
c#·.net·.net core·gc·clr
刀法如飞11 小时前
AI时代,程序员都应该是算法思想工程师
人工智能·设计模式·程序员
在西安放羊的牛油果17 小时前
我把 2000 行下单代码,重构成了一套交易前端架构
前端·设计模式·架构
唐青枫19 小时前
C#.NET Channel 深入解析:高性能异步生产者消费者模型实战
c#·.net
小峥降临1 天前
Rokid UXR 的手势追踪虚拟中更真实的手实战开发【含 工程源码 和 最终完成APK】
c#
寅时码2 天前
React 正在演变为一场不可逆的赛博瘟疫:AI 投毒、编译器迷信与装死的官方
前端·react.js·设计模式
willow5 天前
Axios由浅入深
设计模式·axios
晨星shine5 天前
GC、Dispose、Unmanaged Resource 和 Managed Resource
后端·c#