Unity implémente un modèle de conception - modèle d'état

Unity implémente un modèle de conception - modèle d'état

L'idée principale de conception du modèle d'état est d'abstraire l'état d'un objet dans une interface, puis d'encapsuler son comportement en fonction de ses différents états. De cette façon, la liaison de l'état et du comportement peut être réalisée, et finalement le un découplage efficace des objets et des états peut être obtenu.

Dans le développement réel, la mise en œuvre de la machine à états finis FSM est généralement utilisée.Le FSM et le contrôle de processus dans le cadre GF sont implémentés sur la base de ce principe.
Insérer la description de l'image ici

1.State (classe d'état de base abstraite)

    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

Sous-classes d'état

    /// <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.Contexte

Classe de contexte - contient l'état actuel et transmet les informations pertinentes à l'état

    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. Testez le code

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

        }
    }

Guess you like

Origin blog.csdn.net/zzzsss123333/article/details/133339693