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

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

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

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

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

    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的子类

    /// <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类-持有目前的状态,并将相关信息传给状态

    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.测试代码

    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);

        }
    }

猜你喜欢

转载自blog.csdn.net/zzzsss123333/article/details/133339693