设计模式_状态模式

状态模式

介绍

|------|------------------------------|--------------------------------------|------------------------|---------------------------|
| 设计模式 | 定义 | 案例 | 问题堆积在哪里 | 解决办法 |
| 状态模式 | 一个对象 状态可以发生改变 不同的状态又有不同的行为逻辑 | 游戏角色 加载不同的技能 每个技能有不同的:攻击逻辑 攻击范围 动作等等 | 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 符合了迪米特原则,角色对状态类内部的具体实现不知道

相关推荐
wrx繁星点点4 小时前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式
JungleCoding4 小时前
403 Request Entity Too Lager(请求体太大啦)
状态模式
金池尽干5 小时前
设计模式之——观察者模式
观察者模式·设计模式
也无晴也无风雨6 小时前
代码中的设计模式-策略模式
设计模式·bash·策略模式
捕鲸叉15 小时前
MVC(Model-View-Controller)模式概述
开发语言·c++·设计模式
wrx繁星点点15 小时前
享元模式:高效管理共享对象的设计模式
java·开发语言·spring·设计模式·maven·intellij-idea·享元模式
凉辰15 小时前
设计模式 策略模式 场景Vue (技术提升)
vue.js·设计模式·策略模式
菜菜-plus15 小时前
java设计模式之策略模式
java·设计模式·策略模式
暗黑起源喵15 小时前
设计模式-迭代器
设计模式
lexusv8ls600h17 小时前
微服务设计模式 - 网关路由模式(Gateway Routing Pattern)
spring boot·微服务·设计模式