当前位置: 首页 > 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.lryc.cn/news/593130.html

相关文章:

  • 使用目标检测yolo11去训练微藻细胞检测数据集YOLO格式703张6类别步骤和流程
  • 云端成本治理利器:亚马逊云科技智能仪表盘(AWS Cost Intelligence Dashboard)深度解析
  • Java 大视界 -- Java 大数据机器学习模型在自然语言处理中的对话系统多轮交互优化与用户体验提升(351)
  • 前端面试专栏-工程化:27.工程化实践(CI/CD、代码规范)
  • NLP中情感分析如何结合知识图谱在跨文化领域提升观念分析和价值判断的准确性?
  • 基于Socket来构建无界数据流并通过Flink框架进行处理
  • xss-dom漏洞
  • 力扣 hot100 Day49
  • 【Python练习】050. 编写一个函数,实现简单的日历功能,显示当前日期和星期
  • Uniapp之键盘弹窗
  • 了解pycharm的基本运用
  • Android无需授权直接访问Android/data目录漏洞
  • 开启你的专属智能时代:枫清科技个人智能体限时体验计划上线!
  • 网络基础DAY13-NAT技术
  • 嵌入式学习-PyTorch(9)-day25
  • Tomcat 生产 40 条军规:容量规划、调优、故障演练与安全加固
  • Linux:lvs集群技术
  • steam游戏搬砖项目超完整版实操分享
  • 6-大语言模型—预训练:数据处理
  • HOT100——排序篇Leetcode215. 数组中的第K个最大元素
  • LVS工作模式和算法的总结
  • 相角补偿全通滤波器设计:相位均衡(0~350Hz,15°超前)
  • 《YOLOv13魔术师专栏》全景指南:从理论到工业级实战
  • 计算机网络——IPv4(25王道最新版)
  • python的第三方库的基本运用
  • RISC采用的3种流水技术的功能和区别分析
  • Xss-labs 1-8以及利用python自动sq8注入
  • 定时器与间歇函数
  • 【C++】入门阶段
  • 时序数据库选型实战:Apache IoTDB技术深度解析