设计模式_状态模式

状态模式

介绍

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

类图

角色:

stateBase 抽象状态

stateA 具体状态A

stateB 具体状态B

stateC 具体状态C

FactoryState 状态工厂

代码

RoleContext

cs 复制代码
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

cs 复制代码
public abstract class StateBase
{
    public abstract void Action();
}

StateA

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class StateA : StateBase
{
    string name = "普攻";

    public override void Action()
    {
        Debug.Log("释放-" + name);
    }
}

StateB

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class StateB : StateBase
{
    string name = "次元斩";

    public override void Action()
    {
        Debug.Log("释放-" + name);
    }
}

StateC

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class StateC:StateBase
{
    string name = "升龙击";

    public override void Action()
    {
        Debug.Log("释放-" + name);
    }
}

FactoryState

cs 复制代码
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;
    }
}

测试代码

cs 复制代码
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 符合了迪米特原则,角色对状态类内部的具体实现不知道

相关推荐
nnsix8 小时前
设计模式 - 模板方法模式 笔记
笔记·设计模式·模板方法模式
likerhood12 小时前
设计模式-装饰器模式(java)
java·设计模式·装饰器模式
青瓦梦滋16 小时前
C++特殊类设计(设计模式)和类型转换
c++·设计模式
geovindu16 小时前
python: Monitor Pattern
开发语言·python·设计模式·监控模式
workflower17 小时前
人工智能全球治理
大数据·人工智能·设计模式·机器人·动态规划
workflower17 小时前
AI灵活高效的智慧用能核心场景
大数据·人工智能·设计模式·机器人·动态规划
雪碧聊技术18 小时前
什么是生成器模式?一文详解
设计模式·生成器模式
William_cl19 小时前
第 1 节:MVC + DataTable 百万数据秒加载 —— 企业级服务端分页实战
mvc·状态模式
geovindu19 小时前
go: Monitor Pattern
开发语言·后端·设计模式·golang·监控模式
雪度娃娃19 小时前
行为型设计模式——命令模式
c++·设计模式·命令模式