设计模式---状态模式(DesignPattern_State)

摘录自:设计模式与游戏完美开发

十年磨一剑,作者将设计模式理论巧妙地融入到实践中,以一个游戏的完整实现呈现设计模式的应用及经验的传承 《轩辕剑》之父——蔡明宏、资深游戏制作人——李佳泽、Product Evangelist at Unity Technologies——Kelvin Lo、信仁软件设计创办人—— 赖信仁、资深3D游戏美术——刘明恺 联合推荐全书采用了整合式的项目教学,即以一个游戏的范例来应用23种设计模式的实现贯穿全书,让读者学习到整个游戏开发的全过程和作者想要传承的经验,并以浅显易懂的比喻来解析难以理解的设计模式,让想深入了解此领域的读者更加容易上手。

工程GitHub

源码注释及命名有所更改,个人感觉会比原版更好理解

  • 状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。
  • 一般用于场景切换,因为场景数量有限,而且在场景载入 、运行、退出相关操作流程类似

STATE—跟MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,比如你约她今天晚上去看电影,对你没兴趣的MM就会说“有事情啦”,对你不讨厌但还没喜欢上的MM就会说“好啊,不过可以带上我同事么?”,已经喜欢上你的MM就会说“几点钟?看完电影再去泡吧怎么样?”,当然你看电影过程中表现良好的话,也可以把MM的状态从不讨厌不喜欢变成喜欢哦。

using UnityEngine;
using System.Collections;

namespace DesignPattern_State
{

    // 内涵一种状态,并且对相关状态的操作
    public class StateController
    {
        State   m_State = null;

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

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

    // 状态的抽象类,继承他的子类重写相关操作
    public abstract class State
    {
        protected StateController m_Controller = null;

        public State(StateController theController)
        {
            m_Controller = theController;
        }           
        public abstract void Handle(int Value);
    }

    // 实例状态 A
    public class ConcreteStateA : State
    {
        public ConcreteStateA( StateController theController):base(theController)
        {}

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

    }

    // 实例状态 B
    public class ConcreteStateB : State
    {
        public ConcreteStateB( StateController theController):base(theController)
        {}
        
        public override void Handle (int Value)
        {
            Debug.Log ("ConcreteStateB.Handle");
            if( Value > 20)
                m_Controller.SetState( new ConcreteStateC(m_Controller));
        }
        
    }

    // 实例状态 C
    public class ConcreteStateC : State
    {
        public ConcreteStateC( StateController theController):base(theController)
        {}
        
        public override void Handle (int Value)
        {
            Debug.Log ("ConcreteStateC.Handle");
            if( Value > 30)
                m_Controller.SetState( new ConcreteStateA(m_Controller));
        }       
    }


}
using UnityEngine;
using System.Collections;
using DesignPattern_State;

public class StateTest : MonoBehaviour {

    // Use this for initialization
    void Start () {
        UnitTest(); 
    }
    
    // 
    void UnitTest () 
    {
        StateController theController = new StateController();
        theController.SetState( new ConcreteStateA( theController ));
        theController.Request( 5 );
        theController.Request( 15 );
        theController.Request( 25 );
        theController.Request( 35 );

    }
}
上一篇:Unity【话大】设计模式之策略模式


下一篇:jQuery遍历_其他遍历|学习笔记