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

【设计模式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.dtcms.com/a/287256.html

相关文章:

  • 微服务学习(六)之分布式事务
  • 微服务的编程测评系统-网关-身份认证-redis-jwt
  • Spring Boot 与微服务详细总结
  • Error:HTTP Status 405 - HTTP method POST is not supported by this URL
  • Javascript进程和线程通信
  • Uniapp之键盘弹窗
  • day43 CNN及Grad-CAM实战——以Intel Image Classification为例
  • JAVA中的Collections 类
  • [论文阅读] 人工智能 + 软件工程 | 强化学习在软件工程中的全景扫描:从应用到未来
  • ABP VNext + Temporal:分布式工作流与 Saga
  • 当OT遇见IT:Apache IoTDB如何用“时序空间一体化“破解工业物联网数据孤岛困局
  • 时序数据库选型实战:Apache IoTDB技术深度解析
  • Bicep入门篇
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘pillow’问题
  • C/C++---文件读取
  • kotlin部分常用特性总结
  • Node.js net.Socket.destroy()深入解析
  • 海思3516cv610 NPU学习
  • 【C语言进阶】题目练习(3)
  • kafka--基础知识点--6.1--LEO、HW、LW
  • Validation - Spring Boot项目中参数检验的利器
  • web.m3u8流媒体视频处理
  • Flutter基础(前端教程①③-单例)
  • 定时器与间歇函数
  • Web3.0与元宇宙:区块链驱动的数字新生态解析
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - snowNLP库实现中文情感分析
  • 如何增强LLM(大语言模型)的“置信度”和“自信心” :LLM的“自信”不是“什么都能答”,而是“该答的答得准,不该答的敢说不”。
  • 【unity游戏开发入门到精通——3D篇】3D光源之——unity使用Lens Flare (SRP) 组件实现太阳耀斑镜头光晕效果
  • 《Origin画百图》之多分类矩阵散点图
  • 2025最新版 Go语言Goland 专业安装及配置(超详细)