当我们用Unity进行场景切换时,可能会写下如下代码:

using UnityEngine;
using UnityEngine.SceneManagement;public class ReverseVersion : MonoBehaviour
{private string _state = "到早上了";public void ChanageScene(string StateName){_state = StateName;switch (_state){case "到早上了":Debug.Log("早上起来第一句,就给自己打个气");SceneManager.LoadScene(0);break;case "到中午了":Debug.Log("我饿了,我困了");SceneManager.LoadScene(1);break;case "到晚上了":Debug.Log("我不行了");SceneManager.LoadScene(2);break;default:break;}}
}

这样一看,没啥问题,可是,当场景之间转换的条件复杂了场景多了,那又会是怎样的一副光景呢?

这个类也会越来越庞大,每增加一个场景,就要多一个case,无论任何场景,都需要它来改变。

再或者需要改一下需求和转换条件,你要改动的代码又有多少呢?

责任太过重大,违背了我们的“单一职责原则

那就可以请出我们的的“状态模式”来解决问题

关于状态模式

  • 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
  • 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。对于Unity场景的来说,由于Unity运行时只会有一个场景呈现在大家眼前。所以就显得尤为适用场景之间的切换。
  • 当一个对象的行为取决于它的状态,并且他必须在运行时根据状态改变他的行为时,就可以考虑使用状态模式了。

概念性的东西就这些,直接看项目

首先是State,他作为抽象类让具体状态继承

    public abstract class State{public abstract void WriteProgram(Work w);}

然后是,早上,中午,下午,晚上四个类

    public class ForenoonState:State{public override void WriteProgram(Work w){if (w.Hour < 12){Debug.Log("当前时间:" + w.Hour + "点 上午工作,精神百倍");}else{w.SetState(new NoonState());w.WriteProgram();}}}
public class NoonState:State{public override void WriteProgram(Work w){if (w.Hour < 13){Debug.Log("当前时间:" + w.Hour + "点 饿了,午休;犯困,午休");}else{w.SetState(new AfternoonState());w.WriteProgram();}}}
 public class AfternoonState:State{public override void WriteProgram(Work w){if (w.Hour < 17){Debug.Log("当前时间:" + w.Hour + "点 下午状态还不错,继续努力");}else{w.SetState(new EveningState());w.WriteProgram();}}}
public class EveningState:State{public override void WriteProgram(Work w){if (w.Hour > 18){Debug.Log("当前时间:" + w.Hour + "点 我不行了,要睡着了");}}}

然后是工作类,调控全部的工作状态

public class Work{private State _current;public Work(){_current=new ForenoonState();}private double _hour;public double Hour{get { return _hour; }set { _hour = value; }}public void SetState(State s){_current = s;}public void WriteProgram(){_current.WriteProgram(this);}}

测试脚本

using System.Collections;
using System.Collections.Generic;
using DefaultNamespace;
using UnityEngine;public class Test : MonoBehaviour {private void Start () {Work emergencyProject=new Work();emergencyProject.Hour = 9;emergencyProject.WriteProgram();emergencyProject.Hour = 10;emergencyProject.WriteProgram();emergencyProject.Hour = 12;emergencyProject.WriteProgram();emergencyProject.Hour = 13;emergencyProject.WriteProgram();emergencyProject.Hour = 14;emergencyProject.WriteProgram();emergencyProject.Hour = 17;emergencyProject.WriteProgram();emergencyProject.Hour = 21;emergencyProject.WriteProgram();}}

在Unity创建场景,在场景创建一个空物体,把Test脚本挂载在其上面

运行游戏

这时,我们增加需求:

  1. 出于安全考虑,超过21点,全体员工必须回家
  2. 18点之后,做完工作的可以提前回家

增加下班类

    public class FuckingOutwork:State{public override void WriteProgram(Work w){Debug.Log("下班了,溜了溜了");}}

更改工作类,增加结束工作字段

        private bool _finish = false;public bool Finish{get { return _finish; }set { _finish = value; }}

更改晚上工作类如下

public class EveningState : State{public override void WriteProgram(Work w){if (w.Finish){w.SetState(new FuckingOutwork());w.WriteProgram();}else{if (w.Hour <= 21){Debug.Log("当前时间:" + w.Hour + "点 我不行了,要睡着了");}else{w.SetState(new FuckingOutwork());w.WriteProgram();}}}}

Test脚本增加一条22点的语句

emergencyProject.Hour = 22;
emergencyProject.WriteProgram();

再次运行

Test脚本更改如下

using System.Collections;
using System.Collections.Generic;
using DefaultNamespace;
using UnityEngine;public class Test : MonoBehaviour {private void Start () {Work emergencyProject=new Work();emergencyProject.Hour = 9;emergencyProject.WriteProgram();emergencyProject.Hour = 10;emergencyProject.WriteProgram();emergencyProject.Hour = 12;emergencyProject.WriteProgram();emergencyProject.Hour = 13;emergencyProject.WriteProgram();emergencyProject.Hour = 14;emergencyProject.WriteProgram();emergencyProject.Hour = 17;emergencyProject.WriteProgram();emergencyProject.Finish = true;emergencyProject.WriteProgram();emergencyProject.Hour = 21;emergencyProject.WriteProgram();emergencyProject.Hour = 22;emergencyProject.WriteProgram();}}

再次运行

我们发现,增加的这两个判定条件需要改动的代码量很小。体现出了状态模式的优点。

理论差不多了解,那么我们就需要把它运用到实战中!请看下集

设计模式篇:状态模式(一)相关推荐

  1. 码农小白 设计模式篇 状态模式

    码农小白 设计模式篇 状态模式 1.状态的认识 2.面向过程思维的代码实现 小结: 3.面向对象实现 小结 4.用状态模式实现 1.状态模式的简介 2.状态模式的好处 3.状态模式的使用 4.代码实现 ...

  2. python的编程模式-Python设计模式之状态模式原理与用法详解

    本文实例讲述了Python设计模式之状态模式原理与用法.分享给大家供大家参考,具体如下: 状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 ...

  3. java设计模式之状态模式_Java中的状态设计模式

    java设计模式之状态模式 在本教程中,我们将探讨另一种流行的行为设计模式-状态设计模式. 当我们使用可以存在于多个状态的对象时,状态设计模式的知识变得非常有用. 当对象的行为取决于其当前状态时,我们 ...

  4. 【转】设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  5. 图解java多线程设计模式 pdf_图解Java设计模式之状态模式

    图解Java设计模式之状态模式 APP抽象活动问题 状态模式基本介绍 状态模式的原理类图 状态模式解决APP抽奖问题 状态模式的注意事项和细节 APP抽象活动问题 请编写程序完成APP抽象活动,具体要 ...

  6. android 状态模式,Android编程设计模式之状态模式详解

    本文实例讲述了Android编程设计模式之状态模式.分享给大家供大家参考,具体如下: 一.介绍 状态模式中的行为是由状态来决定的,不同的状态下有不同的行为.状态模式和策略模式的结构几乎完全一样,但它们 ...

  7. python的out模式_Python设计模式之状态模式

    状态模式 面向对象编程着力于在对象交互时改变它们的状态.在很多问题中,有限状态机(通常名为状态机)是一个非常方便的状态转换建模(并在必要时以数学方式形式化)工具.首先,什么是状态机?状态机是一个抽象机 ...

  8. 设计模式之状态模式(State)

    什么是状态? 我们在购物网站进行购物时,订单会产生几种状况:已下单.已付款.送货中.确定收货等状态. 所以系统会判断该订单的状态,不管是哪种状态都应给出对应的操作,这就是状态. 什么是状态模式? 在软 ...

  9. PHP设计模式之状态模式定义与用法详解

    本文实例讲述了PHP设计模式之状态模式定义与用法.分享给大家供大家参考,具体如下: 什么是状态设计模式 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当 ...

  10. 秒懂设计模式之状态模式(State Pattern)

    [版权申明] 非商业目的注明出处可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/116375477 出自:shusheng0 ...

最新文章

  1. MSSQL2005 手工盲注详解
  2. referer 访问控制
  3. ASP.NET中AJAX的UpdatePannel控件的用法
  4. PAT甲级1005 Spell It Right :[C++题解]字符串处理
  5. 高斯牛顿法在具体工程中的应用——C++版
  6. springboot干什么的_Spring Boot 项目的这些文件都是干啥用的?
  7. 简单话题:LED呼吸灯和串口LED指示灯
  8. 2021.03.14.浩楠卷子
  9. PHP在不同页面间传递Json数据示例代码
  10. [CentOs7]搭建ftp服务器(3)——上传,下载,删除,重命名,新建文件夹
  11. mrst 实施编辑器 data流程
  12. inline函数的好处与缺点
  13. hread.interrupt()到底意味着什么
  14. ffmpeg 在linux下编译
  15. [转]【基于zxing的编解码实战】精简Barcode Scanner篇
  16. java程序设计编程题_JAVA编程题全集100题及答案
  17. 吴昊品游戏核心算法 Round 5 —— (转载)十四步实现拥有强大AI的五子棋游戏...
  18. 使用浏览器检查工具下载网页视频
  19. [图形学] 实时体积云(Horizon: Zero Dawn)
  20. Android PMS的理解

热门文章

  1. 怎么训练兔子在指定的地点大小便
  2. 靶向抗体偶联-靶向EGFR抗体偶联药物技术-瑞禧
  3. IDEA 搭建黑马品优购商城
  4. IMU参数对比(未完待续)
  5. 手把手教你使用CNN进行交通标志识别(已开源)
  6. Unity使用RenderTexture实现实时阴影绘制
  7. iphone13支持双卡双待吗 苹果13是5g吗
  8. wikioi1369 xth 砍树
  9. 自学python积累
  10. vue+springcloud出现跨域问题