状态模式
介绍
| 设计模式 | 定义 | 案例 | 问题堆积在哪里 | 解决办法 | 
| 状态模式 | 一个对象 状态可以发生改变 不同的状态又有不同的行为逻辑  | 游戏角色 加载不同的技能 每个技能有不同的:攻击逻辑 攻击范围 动作等等  | 1 状态很多 2 每个状态有自己的属性和逻辑  | 每种状态单独写一个类 角色需要那个状态就加载哪一个  | 
类图
角色:
stateBase 抽象状态
stateA 具体状态A
stateB 具体状态B
stateC 具体状态C
FactoryState 状态工厂

代码
RoleContext
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RoleContext
{
    string name;
    StateBase currentState = null;
    public RoleContext()
    {
        name = "独孤求败";
    }
    // 展示动作
    public void ShowAction()
    {
        if (null != currentState)
        {
            currentState.Action();
        }
    }
    // 切换状态
    public void ChangeActionState(StateBase newState)
    {
        currentState = newState;
    }
}
 
StateBase
public abstract class StateBase
{
    public abstract void Action();
}
 
StateA
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StateA : StateBase
{
    string name = "普攻";
    public override void Action()
    {
        Debug.Log("释放-" + name);
    }
}
 
StateB
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StateB : StateBase
{
    string name = "次元斩";
    public override void Action()
    {
        Debug.Log("释放-" + name);
    }
}
 
StateC
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StateC:StateBase
{
    string name = "升龙击";
    public override void Action()
    {
        Debug.Log("释放-" + name);
    }
}
 
FactoryState
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FactoryState
{
    // 单例
    static FactoryState  self = null;
    FactoryState() { }
    public static  FactoryState Instance()
    {
        if (null == self)
            self = new FactoryState();
        return self;
    }
    Dictionary<string, StateBase> dic = new Dictionary<string, StateBase>();
    // 获取实例
    public StateBase GetStateIns(string className)
    {
        StateBase ins = null;
        switch (className)
        {
            case "StateA":
                {
                    if (false == dic.ContainsKey(className))
                        ins = new StateA();
                    else
                        ins = dic[className];
                }
                break;
            case "StateB":
                {
                    if (false == dic.ContainsKey(className))
                        ins = new StateB();
                    else
                        ins = dic[className];
                }
                break;
            case "StateC":
                {
                    if (false == dic.ContainsKey(className))
                        ins = new StateC();
                    else
                        ins = dic[className];
                }
                break;
            default:
                Debug.Log("未发现该类!");
                break;
        }
        return ins;
    }
}
 
测试代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestZT : MonoBehaviour
{
    void Start()
    {
        RoleContext role = new RoleContext();
        // 切换技能A
        role.ChangeActionState(FactoryState.Instance().GetStateIns("StateA"));
        role.ShowAction();
        // 切换技能B
        role.ChangeActionState(FactoryState.Instance().GetStateIns("StateB"));
        role.ShowAction();
        // 切换技能C
        role.ChangeActionState(FactoryState.Instance().GetStateIns("StateC"));
        role.ShowAction();
    }
}
 
结果

总结
状态模式
1 是一个非常好用的 解耦合的手段, 角色不同的状态封装不同的(动作,属性,限制)
2 非常符合对修改封闭对扩展开发的原则。
3 让状态的职责更加的单一
4 也符合了依赖倒置 ,依赖了抽象
5 符合了迪米特原则,角色对状态类内部的具体实现不知道

![[C++]命名空间等——喵喵要吃C嘎嘎](https://img-blog.csdnimg.cn/f74c76d54537422ca5d9ba61d83b4bfb.png)

















