网站怎么添加手机版,大沥网站建设,如何做网站的维护,辽宁省住房和城乡建设部网站主页状态模式 介绍
设计模式定义案例问题堆积在哪里解决办法状态模式一个对象 状态可以发生改变 不同的状态又有不同的行为逻辑游戏角色 加载不同的技能 每个技能有不同的#xff1a;攻击逻辑 攻击范围 动作等等1 状态很多 2 每个状态有自己的属性和逻辑每种状态单独写一个类 角色…状态模式 介绍
设计模式定义案例问题堆积在哪里解决办法状态模式一个对象 状态可以发生改变 不同的状态又有不同的行为逻辑游戏角色 加载不同的技能 每个技能有不同的攻击逻辑 攻击范围 动作等等1 状态很多 2 每个状态有自己的属性和逻辑每种状态单独写一个类 角色需要那个状态就加载哪一个 类图
角色
stateBase 抽象状态
stateA 具体状态A
stateB 具体状态B
stateC 具体状态C
FactoryState 状态工厂 代码
RoleContext
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class RoleContext
{string name;StateBase currentState null;public RoleContext(){name 独孤求败;}// 展示动作public void ShowAction(){if (null ! currentState){currentState.Action();}}// 切换状态public void ChangeActionState(StateBase newState){currentState newState;}
}StateBase public abstract class StateBase
{public abstract void Action();
}StateA
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class StateA : StateBase
{string name 普攻;public override void Action(){Debug.Log(释放- name);}
}StateB
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class StateB : StateBase
{string name 次元斩;public override void Action(){Debug.Log(释放- name);}
}StateC
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class StateC:StateBase
{string name 升龙击;public override void Action(){Debug.Log(释放- name);}
}FactoryState
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class FactoryState
{// 单例static FactoryState self null;FactoryState() { }public static FactoryState Instance(){if (null self)self new FactoryState();return self;}Dictionarystring, StateBase dic new Dictionarystring, StateBase();// 获取实例public StateBase GetStateIns(string className){StateBase ins null;switch (className){case StateA:{if (false dic.ContainsKey(className))ins new StateA();elseins dic[className];}break;case StateB:{if (false dic.ContainsKey(className))ins new StateB();elseins dic[className];}break;case StateC:{if (false dic.ContainsKey(className))ins new StateC();elseins dic[className];}break;default:Debug.Log(未发现该类);break;}return ins;}
}测试代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class TestZT : MonoBehaviour
{void Start(){RoleContext role new RoleContext();// 切换技能Arole.ChangeActionState(FactoryState.Instance().GetStateIns(StateA));role.ShowAction();// 切换技能Brole.ChangeActionState(FactoryState.Instance().GetStateIns(StateB));role.ShowAction();// 切换技能Crole.ChangeActionState(FactoryState.Instance().GetStateIns(StateC));role.ShowAction();}}结果 总结
状态模式
1 是一个非常好用的 解耦合的手段 角色不同的状态封装不同的动作属性限制
2 非常符合对修改封闭对扩展开发的原则。
3 让状态的职责更加的单一
4 也符合了依赖倒置 依赖了抽象
5 符合了迪米特原则角色对状态类内部的具体实现不知道