QFrameWork学习(五) 简易有限状态机与类关系

文章地址:https://www.cnblogs.com/liangxiegame/p/Unity-you-xi-kuang-jia-da-jian-si-jian-yi-you-xian.html


一、有限状态机

 

先看一下代码:

public class FSM {
    // 定义函数指针类型
    public delegate void FSMTranslationCallfunc();    
    /// 
    /// 状态类
    /// 
    public class FSMState
    {
        public string name;

        public FSMState(string name)
        {
            this.name = name;
        }
        /// 
        /// 存储事件对应的条转
        /// 
        public Dictionary  TranslationDict = new Dictionary();
    }
    /// 
    /// 跳转类
    /// 
    public class FSMTranslation
    {
        public FSMState fromState;
        public string name;
        public FSMState toState;
        public FSMTranslationCallfunc callfunc; // 回调函数

        public FSMTranslation(FSMState fromState,string name, FSMState toState,FSMTranslationCallfunc callfunc)
        {
            this.fromState = fromState;
            this.toState   = toState;
            this.name = name;
            this.callfunc = callfunc;
        }
    }
    // 当前状态
    private FSMState mCurState;

    Dictionary  StateDict = new Dictionary();
    /// 
    /// 添加状态
    /// 
    /// State.
    public void AddState(FSMState state)
    {
        StateDict [state.name] = state;
    }
    /// 
    /// 添加条转
    /// 
    /// Translation.
    public void AddTranslation(FSMTranslation translation)
    {
        StateDict [translation.fromState.name].TranslationDict [translation.name] = translation;
    }
    /// 
    /// 启动状态机
    /// 
    /// State.
    public void Start(FSMState state)
    {
        mCurState = state;
    }
    /// 
    /// 处理事件
    /// 
    /// Name.
    public void HandleEvent(string name)
    {
        if (mCurState != null && mCurState.TranslationDict.ContainsKey(name)) {
            Debug.LogWarning ("fromState:" + mCurState.name);

            mCurState.TranslationDict [name].callfunc ();
            mCurState = mCurState.TranslationDict [name].toState;


            Debug.LogWarning ("toState:" + mCurState.name);
        }
    }
}

 QFrameWork学习(五) 简易有限状态机与类关系_第1张图片

 

上图为根据代码所画的Uml类结构图。

       有限状态机本身是一个设计模式,用于处理状态机模式主要用于解决当控制对象转换状态的条件过于复杂时的情况。把复杂的判断逻辑简化,一般在游戏开发中也常用于AI。

       状态机的案例在网上有各个不同的版本,以上这个状态机我觉得并不是一个好的设计模式,这里我只想说一下设计模式中类的关系,只有真正掌握了设计原则、明确了类的业务分工和关系,设计模式其实就在无形中有了形。

 

二、类关系

类的关系大体分为五种:关联、依赖、组合、聚合、继承

1.关联:关联一般表示两个关系平等的对象,例如我和我朋友。关联一般体现为一个类对象作为另一个类对象的成员变量

2.聚合:聚合是关联的一种特例。他是一种整体与部分、拥有的关系,即has关系。此时的整体与部分是可以分离的,它们并不共享同一个生命周期。比如雁群和大雁,雁群拥有大雁,但是大雁也可以独立存在。

3.组合:组合也是关联的一种特例。他是一种contain的关系,这种关系比聚合更强。他也是整体与部分的关系,但是此时整体和部分是密不可分的。比如人的头与嘴巴,鸟与翅膀。

4.依赖:依赖关系是一种弱耦合,它是一种临时性的、偶然的使用,但是一个类的变化仍然会影响到另一个类。

5.继承:继承是描述一种父与子的关系,若不是明显的is关系,建议使用聚合组合。

原因如下:

(1)子类会继承父类的所有公有和受保护的成员,这时候有可能继承了无用甚至有害的方法

(2)很容易造成类的无限膨胀

(3)组合聚合可以比继承更加灵活,可以在运行时才决定某个对象。举个例子比如咖啡,加糖咖啡,冰咖啡,这时候应该把咖啡,糖,冰单独作为对象组合起来,而不是使用继承。

 

你可能感兴趣的:(#,框架QFramework)