Unity学习笔记:设计模式-STATE(状态)

关键词:状态决定行为

对象状态的改变,从而带来行为上的变化。

图:

允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类

适用性:

• 一个对象的行为取决于它的状态 ,  并且它必须在运行时刻根据状态改变它的行为

• 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状

态通常用一个或多个枚举常量表示。通常 ,  有多个操作包含这一相同的条件结构。 S t a t e模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对

象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。

案例:(瓶子打开关闭)

using System;
namespace State_DesignPattern2
{
   
    //1
    public enum StateSetting状态枚举
    {
        Closed,
        Opened
    }
    //2
    abstract class State
    {
        protected string strStatename;
        abstract public void Pour();//倒水
        // do something state-specific here
    }
    // 状态实现类 ------
    class OpenedState : State
    {
        public OpenedState()
        {
            strStatename = "Opened";
        }
        override public void Pour()
        {
            Console.WriteLine("...水流出...");
           
        }
    }
    class ClosedState : State
    {
        public ClosedState()
        {
            strStatename = "Closed";
        }
        override public void Pour()
        {
            Console.WriteLine("关闭状态:水没有流出!");
        }
    }    
    //3
    class 瓶子_状态机
    {     
        // If teh state classes had large amounts of instance data,
        // we could dynamically create them as needed - 
        ///if this demo// they are tiny, so we just  create them as data members
        //1.0
        //OpenedState openedState = new OpenedState();
        //ClosedState closedState = new ClosedState();
        //2.0 动态创建状态对象-反射
        //1:定义状态集合 2:反射技术 把每个状态放到 状态集合中

        //1》要确定当前状态 并初始化
        public 瓶子_状态机()
        {            
            // Initialize to closed
            CurrentState当前状态 = new ClosedState();
        }
        private State CurrentState当前状态;
        //2》定义状态切换的方法
        public void SetState修改状态(StateSetting状态枚举 newState)
        {
            //if (newState == StateSetting状态枚举.Closed)
            //{
            //    CurrentState当前状态 = closedState;
            //}
            //else
            //{
            //    CurrentState当前状态 = openedState;
            //}
            string allName = "State_DesignPattern2." + newState + "State";
            Type typeObj = Type.GetType(allName);          
            CurrentState当前状态 = (State)Activator.CreateInstance(typeObj); ;
        }
        //3》调用当前状态的方法
        public void Pour()
        {
            CurrentState当前状态.Pour();
        }
    }

    /// <summary>
    ///    Summary description for Client.
    /// </summary>
    public class Client
    {
        public static void Main(string[] args)
        {
            瓶子_状态机 bottle = new 瓶子_状态机();

            Console.WriteLine("初始状态:关闭");
            bottle.Pour();

            Console.WriteLine("打开瓶子:");
            bottle.SetState修改状态(StateSetting状态枚举.Opened);
            bottle.Pour();

            bottle.SetState修改状态(StateSetting状态枚举.Closed);
            bottle.Pour();
            Console.ReadKey();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/huanyu0127/article/details/107829808
今日推荐