当前位置: 首页 > web >正文

【设计模式C#】状态模式(用于解决解耦多种状态之间的交互)

一种行为设计模式。

特点是用类的方式去管理状态。

优点:

  1. 对每个状态进行了封装,提高了代码的可维护性;
  2. 减少了条件判断语句的使用,降低维护成本;
  3. 易于扩展,每次新增状态都无需大规模修改其他类,符合开闭原则;

缺点:

  1. 会导致类的增加,每个状态都会是一个单独的类;
  2. 增加了性能的开销,状态的实例化会导致性能消耗增加。

用途:

  1. 设计游戏中人物的状态
  2. 设计网络连接时的状态
  3. 设计订单的状态

主要组成部分:

状态的接口:它定义了每个状态的实现规则。

每个状态的具体实现类:定义了状态的具体的实现逻辑和切换逻辑。

上下文(或者叫控制器):维护一个具体状态的引用,通常是指调用状态对象。

实例:

//状态的接口
using UnityEngine;/// <summary>
/// 每个场景的状态接口类
/// </summary>
public abstract class ISceneState
{   private string mSceneName;//场景名称protected SceneStateController mController;//场景状态控制器public ISceneState(string sceneName, SceneStateController controller){mSceneName = sceneName;mController = controller;}public string SceneName{get { return mSceneName; }}/// <summary>/// 状态开始时调用/// </summary>public virtual void StateStart() { }/// <summary>/// 状态结束时调用/// </summary>public virtual void StateEnd() { }/// <summary>/// 状态更新时调用/// </summary>public virtual void StateUpdate() { }
}
//状态的实现类
using UnityEngine;
using UnityEngine.UI;public class StartState: ISceneState
{public StartState(SceneStateController controller) :base("01StartScene", controller){}private Image mLOGO;private float mSmoothingTime = 1f;//LOGO过渡时间private float mWaitTime = 2f;//进入MainMenue前等待时间public override void StateStart(){mLOGO = GameObject.Find("Canvas/LOGO").GetComponent<Image>();mLOGO.color = Color.black;}public override void StateUpdate(){//LOGO图片的缓冲过渡mLOGO.color = Color.Lerp(mLOGO.color, Color.white, mSmoothingTime * Time.deltaTime);//等待时间mWaitTime -= Time.deltaTime;//LOGO图片的缓冲过渡if(mWaitTime <= 0){mController.SetState(new MainMenuState(mController));}}
}
//状态的实现类
using UnityEngine;
using UnityEngine.UI;public class MainMenuState: ISceneState
{public MainMenuState(SceneStateController controller): base("02MainMenuScene", controller){}public override void StateStart(){GameObject.Find("Canvas/StartButton").GetComponent<Button>().onClick.AddListener(StartGameButtonOnClick);}public void StartGameButtonOnClick(){mController.SetState(new BattleState(mController));}
}
//状态的实现类
public class BattleState: ISceneState
{public BattleState(SceneStateController controller): base("03BattleScene", controller){}public override void StateStart(){GameFacade.Instance.Init();}public override void StateEnd(){GameFacade.Instance.Release();}public override void StateUpdate(){   if(GameFacade.Instance.isGameOver){mController.SetState(new MainMenuState(mController));}GameFacade.Instance.Update();}
}
//上下文(或者叫控制器):
using UnityEngine;
using UnityEngine.SceneManagement;public class SceneStateController
{private ISceneState mState;//当前场景状态private AsyncOperation mAO;//异步加载场景private bool mIsRunStart = false;//表示场景是否已经正在运行中/// <summary>/// 设置场景状态/// </summary>/// <param name="state">状态</param>/// <param name="isLoadScene">是否加载场景</param>public void SetState(ISceneState state, bool isLoadScene = true){   //退出状态时的处理if(mState != null){mState.StateEnd();}//设置新状态mState = state;//加载场景if(isLoadScene){mAO = SceneManager.LoadSceneAsync(mState.SceneName);mIsRunStart = false;}else{mState.StateStart();mIsRunStart = true;}}/// <summary>/// 更新场景状态/// </summary>public void StateUpdate(){if (mAO != null && mAO.isDone == false) return;if(mIsRunStart == false && mAO != null && mAO.isDone == true){mState.StateStart();mIsRunStart = true;}if(mIsRunStart && mState != null){mState.StateUpdate();}}
}

http://www.xdnf.cn/news/15861.html

相关文章:

  • 中间件安全攻防全解:从Tomcat到Weblogic反序列化漏洞介绍
  • 使用DataGrip连接安装在Linux上的Redis
  • FreeRTOS—列表和列表项
  • 相机参数的格式与作用
  • Vue3 学习教程,从入门到精通,Vue 3 声明式渲染语法指南(10)
  • 快速上手AI整合包!GPT-SoVITS-v2打包教程,解锁AIStarter应用市场潜力
  • DC-DC降压转换5.5V/3A高效率低静态同步降压转换具有自适应关断功能
  • Bicep入门篇
  • 小谈相机的学习过程
  • Linux_基础指令(一)
  • windows docker-02-docker 最常用的命令汇总
  • JMeter 元件使用详解
  • 统计学习方法的三要素
  • 深入了解 find_element 方法:Web 自动化定位元素的核心​
  • Codeforces Round 1037 (Div. 3)(补题)
  • 前端面试专栏-工程化:27.工程化实践(CI/CD、代码规范)
  • 六种经典排序算法:从原理到 Java 实现
  • Linux系统之kbdrate 命令详解
  • Linux:多线程---深入生产消费模型环形队列生产消费模型
  • STM32
  • 泛型机制详解
  • Linux系统日志管理入门:journalctl命令完全指南
  • Go语言实战案例-判断一个数是否为质数
  • 路由器的Serial 串口理解
  • 【安卓笔记】RxJava的Hook机制,整体拦截器
  • AWS Partner: Sales Accreditation (Business)
  • 从零构建监控系统:先“完美设计”还是先“敏捷迭代”?
  • 智能点餐推荐网站,解决选择困难
  • AE PDW2200电源射频手侧使用安装说明含电路图
  • 谷歌地球与ArcGIS Pro查看三维地形