状态模式

文章目录

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
*/
相关推荐
前端不太难4 小时前
智能体可信之路:全链路安全防御
安全·状态模式·openclaw
csdn_aspnet7 小时前
C# 求n边凸多边形的对角线数量(Find number of diagonals in n sided convex polygon)
开发语言·算法·c#
大数据新鸟9 小时前
设计模式详解——观察者模式
观察者模式·设计模式
武藤一雄11 小时前
C# 设计模式大全(第一弹|7种)
microsoft·设计模式·微软·c#·.net·.netcore
格林威12 小时前
Baumer相机锂电池极片裁切毛刺检测:防止内部短路的 5 个核心方法,附 OpenCV+Halcon 实战代码!
开发语言·人工智能·数码相机·opencv·计算机视觉·c#·视觉检测
多看书少吃饭13 小时前
Vue3 + Java + Python 打造企业级大模型知识库(含 SSE 流式对话完整源码)
java·python·状态模式
向上的车轮13 小时前
熟悉C#如何转TypeScript——SDK与包引用
开发语言·typescript·c#
Aloha_up13 小时前
常见设计模式简介
设计模式
CSharp精选营14 小时前
Dispose 不释放?C# 资源泄漏的 3 种隐蔽场景排查
c#·资源泄漏
砍光二叉树15 小时前
【设计模式】行为型-迭代器模式
设计模式·迭代器模式