工厂方法模式

来源:互联网 发布:python idle打不开 编辑:程序博客网 时间:2024/06/15 19:44

今天的流水账:
  5:00 入睡
  11:40 起床
  14:00~20:00 跑酷游戏

  公众号空了一天,之前的某一天,不小心在00:00之后推送了消息,因为微信公众号每天只能发一条群发,所以之后的每天写好blog后要等到第二天00:00才能发消息。

状态机改进:

  之前实现的状态机用得不太顺手,今天抽时间改了一下。

using UnityEngine;  using System.Collections;  using System.Collections.Generic;/// <summary>/// 可以改进的地方/// 1.全部改成字符串/// </summary>public class FSM {      // 定义函数指针类型    public delegate void FSMCallfunc();    /// <summary>    /// 状态类    /// </summary>    public class FSMState     {               public string name;        public FSMState(string name)        {            this.name = name;        }        /// <summary>        /// 存储事件对应的条转        /// </summary>        public Dictionary <string,FSMTranslation> TranslationDict = new Dictionary<string,FSMTranslation>();    }    /// <summary>    /// 跳转类    /// </summary>    public class FSMTranslation    {        public string fromState;        public string name;        public string toState;        public FSMCallfunc callfunc;    // 回调函数        public FSMTranslation(string fromState,string name, string toState,FSMCallfunc callfunc)        {            this.fromState = fromState;            this.toState   = toState;            this.name = name;            this.callfunc = callfunc;        }    }    // 当前状态    private string mCurState;    // 状态    Dictionary <string,FSMState> StateDict = new Dictionary<string,FSMState>();    /// <summary>    /// 添加状态    /// </summary>    /// <param name="state">State.</param>    public void AddState(string name)    {        StateDict [name] = new FSMState(name);    }    /// <summary>    /// 添加条转    /// </summary>    /// <param name="translation">Translation.</param>    public void AddTranslation(string fromState,string name,string toState,FSMCallfunc callfunc)    {        StateDict [fromState].TranslationDict [name] = new FSMTranslation (fromState, name, toState, callfunc);    }    /// <summary>    /// 启动状态机    /// </summary>    /// <param name="state">State.</param>    public void Start(string name)    {        mCurState = name;    }    /// <summary>    /// 处理事件    /// </summary>    /// <param name="name">Name.</param>    public void HandleEvent(string name)    {        if (mCurState != null && StateDict[mCurState].TranslationDict.ContainsKey(name)) {            Debug.LogWarning ("fromState:" + mCurState);            StateDict[mCurState].TranslationDict [name].callfunc ();            mCurState =  StateDict[mCurState].TranslationDict [name].toState;            Debug.LogWarning ("toState:" + mCurState);        }    }}// 测试代码        // 添加状态        PlayerModel.Instance ().fsm.AddState ("idle");        PlayerModel.Instance ().fsm.AddState ("run");        PlayerModel.Instance ().fsm.AddState ("jump");        PlayerModel.Instance ().fsm.AddState ("double_jump");        PlayerModel.Instance ().fsm.AddState ("die");        // 添加跳转        PlayerModel.Instance ().fsm.AddTranslation("run","touch_down","jump",Jump);        PlayerModel.Instance ().fsm.AddTranslation("jump", "touch_down", "double_jump", DoubleJump);        PlayerModel.Instance ().fsm.AddTranslation ("jump", "land", "run", Run);        PlayerModel.Instance ().fsm.AddTranslation ("double_jump", "land", "run", Run);        // 启动        PlayerModel.Instance ().fsm.Start ("run");
给女票写的:

  工厂方法:定义创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。

何时使用:
  编译时无法准确预期要创建的对象的类;
  类想让其子类决定在运行时创建什么;
  类有若干辅助类为其子类,而你想将返回哪个子类这一信息局部化;

  在Cocoa Touch框架中可以用alloc init来创建NSNumber实例子,然而没什么卵用。需要用[NSNumber numberWithBool:YES]消息会得到NSNumber的子类NSCFBoolean的一个实例。 好处:安全,引入新的产品并不需要修改客户端代码。

转载请注明地址:独立日记

微信公众号:QWERTeam

0 0