工厂方法模式
来源:互联网 发布: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
- 工厂模式 -- 工厂方法
- 工厂模式-工厂方法
- 工厂模式-工厂方法
- 工厂 > 工厂方法模式
- 工厂模式-工厂方法模式
- 工厂模式-工厂方法模式
- 工厂模式---工厂方法模式
- 【模式】工厂方法模式
- 工厂方法,抽象工厂模式
- C#工厂模式-工厂方法
- 工厂模式 和工厂方法
- 工厂模式-C-工厂方法
- 工厂模式以及工厂方法
- 简单工厂、工厂方法、抽象工厂模式
- 简单工厂、工厂方法、抽象工厂模式
- 工厂模式(简单工厂、工厂方法)
- 简单工厂|工厂方法|抽象工厂模式
- 设计模式-工厂模式(简单工厂模式+工厂方法模式)
- 爱情十问
- html文件查看器
- 独立日记 2015年12月27日 day6
- POJ--3321 Apple Tree(树状数组+dfs(序列))
- 测试 setjmp 和 longjmp 的用法
- 工厂方法模式
- js中关于导航切换效果-之一(鼠标移动)
- 设计模式开篇
- Spring(二)--Bean装配
- PHP 自 5.2 到 5.6 中新增的功能详解
- c语言16进制输出
- 如何让div中的table居中
- html文件查看器2
- Lua封装将数字转换成万显示