Unity实现设计模式——状态模式

Unity实现设计模式------状态模式

状态模式最核心的设计思路就是将对象的状态抽象出一个接口,然后根据它的不同状态封装其行为,这样就可以实现状态和行为的绑定,最终实现对象和状态的有效解耦。

在实际开发中一般用到FSM有限状态机的实现,GF框架中的FSM和流程控制就是基于这个原理实现的。

1.State(状态的抽象基类)

csharp 复制代码
    public abstract class State
    {
        protected Context m_Context = null;

        public State(Context theContext)
        {
            m_Context = theContext;
        }
        public abstract void Handle(int Value);
    }

2.ConcreteStateA,ConcreteStateB,ConcreteStateC

状态State的子类

csharp 复制代码
    /// <summary>
    /// 状态A
    /// </summary>
    public class ConcreteStateA : State
    {
        public ConcreteStateA(Context theContext) : base(theContext)
        { }

        public override void Handle(int Value)
        {
            Debug.Log("ConcreteStateA.Handle");
            if (Value > 10)
                m_Context.SetState(new ConcreteStateB(m_Context));
        }

    }

    /// <summary>
    /// 状态B
    /// </summary>
    public class ConcreteStateB : State
    {
        public ConcreteStateB(Context theContext) : base(theContext)
        { }

        public override void Handle(int Value)
        {
            Debug.Log("ConcreteStateB.Handle");
            if (Value > 20)
                m_Context.SetState(new ConcreteStateC(m_Context));
        }

    }

    /// <summary>
    /// 状态C
    /// </summary>
    public class ConcreteStateC : State
    {
        public ConcreteStateC(Context theContext) : base(theContext)
        { }

        public override void Handle(int Value)
        {
            Debug.Log("ConcreteStateC.Handle");
            if (Value > 30)
                m_Context.SetState(new ConcreteStateA(m_Context));
        }
    }

3.Context

Context类-持有目前的状态,并将相关信息传给状态

csharp 复制代码
    public class Context
    {
        State m_State = null;

        public void Request(int Value)
        {
            m_State.Handle(Value);
        }

        public void SetState(State theState)
        {
            Debug.Log("Context.SetState:" + theState);
            m_State = theState;
        }
    }

4.测试代码

csharp 复制代码
    public class StatePatternExample5 : MonoBehaviour
    {
        void Start()
        {
            UnitTest();
        }

        void UnitTest()
        {
            Context theContext = new Context();
            theContext.SetState(new ConcreteStateA(theContext));
            theContext.Request(5);
            theContext.Request(15);
            theContext.Request(25);
            theContext.Request(35);

        }
    }
相关推荐
蔡蓝6 小时前
设计模式-建造者模式
服务器·设计模式·建造者模式
不伤欣11 小时前
游戏设计模式 - 子类沙箱
游戏·unity·设计模式
漫谈网络11 小时前
MVC与MVP设计模式对比详解
设计模式·mvc
蔡蓝11 小时前
设计模式-观察着模式
java·开发语言·设计模式
哆啦A梦的口袋呀13 小时前
基于Python学习《Head First设计模式》第六章 命令模式
python·学习·设计模式
半路下车14 小时前
【Harmony OS 5】HarmonyOS应用测试指南
设计模式·harmonyos
周某某~14 小时前
一.设计模式的基本概念
设计模式
on the way 12315 小时前
行为型设计模式之Interpreter(解释器)
设计模式
cui_hao_nan15 小时前
设计模式——模板方法
java·设计模式
在未来等你15 小时前
Java并发编程实战 Day 11:并发设计模式
java·设计模式·多线程·并发编程·threadlocal·生产者消费者·读写锁