此类型的博客的写作初衷在于,整理自己平时所学的知识,随时欢迎各路大神指正

//绿色字的内容为注释

  • 什么时候使用状态模式/状态模式有什么用?

官方的说法是,当对象有很明确的状态划分的时候;

 1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。

2.一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。(360百科)

如:地下城与勇士中,战斗法师的觉醒技能:变身贝亚娜斗神;如下情况通常会使用状态模式
            当玩家变身为贝亚娜状态之前,战斗法师的前冲攻击(→→+X)是这样的——
战斗法师使用手中的武器敲击敌方的头部;
            当玩家变身为贝亚娜状态之后,变身的战斗法师的前冲攻击(→→+X)是这样的——
战斗法师使用手中矛形的武器突刺对方

总结来讲就是://这种方法只是此模式的一种用法

当你希望用户(玩家)

使用相同的操作方式/*都是释放前冲攻击*/(调用相同的函数名,但实际会因当前的状态不同,使用的是不同的函数,或者说函数调用的方式不变),

游戏或者程序会产生不同的操作响应时就可以使用状态模式;

状态模式的好处

符合单一指责原则、开闭原则、迪米特法则(最少知道法则)
将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。
  • 状态模式的核心写法/如何写一个状态模式?(小部分内容参考自《设计模式与游戏完美开发》)

想写一个状态模式的基本框架很简单,我们只需要写三部分(三种类型的类)的内容

1、Context(状态的拥有者:战斗法师)

2、IState(抽象状态类/抽象状态模板,定义了前冲攻击这个技能,但并不会写出具体的实现方法/*通常是虚方法*/,通常会使用abstract抽象类去写,也可以使用接口Instance,或者普通类class)

3、继承IState的具体状态类(通常有多个 这个类override重写了前冲攻击这个技能的技能效果)

(1)State战斗法师(战斗法师使用手中的武器敲击敌方的头部;)

(2)State贝亚娜斗神(战斗法师使用手中矛形的武器突刺对方;)

这三部分拆分开来讲:

Context状态的拥有者只需要写3条内容:

1、存放IState类的字段//用来存放当前状态,和下面类似

2、SetState(IState)方法//用来设置当前状态,和下面类似/给上面的一条赋值

3、Requast()//可以同时写多个这种类型的方法,方法内部,放入对应的状态框架中的方法,像什么Update()方法,Enable()方法等专门给外界调用的方法,是子状态中的方法与外界交流的唯一出口

        public class Context{/// <summary>/// 用来保存当前状态/// </summary>protected State state;/// <summary>/// 给外界调用的设置状态方法/// </summary>/// <param name="state"></param>public void SetState(State state){this.state = state;}/// <summary>/// 使用状态模式的方法,通过这个可以间接的转换状态/// </summary>/// <param name="var"></param>public void Request(int var){state.Headle(var);}}

  IState状态的框架也同样有3样东西:

1、存放Context类的字段//用来方便子状态使用,和上面类似:如 切换状态

2、自身的构造函数//用来给Context赋值,和上面类似/给上面一条赋值

3、留给子状态继承并重写的所有抽象方法//和上面一样,也不限于一个方法

        public abstract class State{/// <summary>/// 状态中保存有当前状态的拥有者/// </summary>protected Context context;/// <summary>/// 想创建一个State 必须new一个此状态的拥有者,没有拥有者哪来的状态/// </summary>/// <param name="context"></param>public State(Context context){this.context = context;}/// <summary>/// 给其他扩展状态设置的此状态执行的操作/// </summary>/// <param name="var"></param>public abstract void Headle(int var);}

子状态只有2个主要任务:

1、重写父类方法,实现功能

2、切换状态

//使用默认构造函数

        public class ConcreteStateA : State{public ConcreteStateA(Context context) : base(context){}public override void Headle(int var){if (var > 10)context.SetState(new ConcreteStateB(context));Debug.Log("ConcreteStateA");}}public class ConcreteStateB : State{public ConcreteStateB(Context context) : base(context){}public override void Headle(int var){if (var > 40){context.SetState(new ConcreteStateA(context));}Debug.Log("ConcreteStateB");}}
  • 写好了状态模式后,又该如何去使用状态模式呢?

使用状态模式分3步

1、new一个状态的拥有者出来//连角色都没有,怎么可能让角色有状态

2、刚刚new出来的拥有者SetState()设置一个初始状态//创建好了新角色以后,此角色总得有个状态吧,让她站着还是坐着随你便

3、使用拥有者中的公有方法来间接调用子状态中的方法

public class StateText : MonoBehaviour {void Start(){UnitTest();}void UnitTest(){Context theContext = new Context();//new一个状态的拥有者theContext.SetState(new ConcreteStateA(theContext));//设置一个初始状态,这里传入new出的拥有者的目地是,给IState中的Context赋值theContext.Request(5);//使用拥有者中的公有方法来间接调用子状态中的方法theContext.Request(15);theContext.Request(25);theContext.Request(35);theContext.Request(55);}
}

设计模式 之 状态模式//用游戏中的例子解释设计模式相关推荐

  1. 设计模式 之 桥接模式 //依旧是游戏中的例子来解释设计模式

    桥接模式(Bridge)//此系列的文章仅用于个人笔记整理所用,欢迎各位大佬帮忙指正,鞠躬 什么是桥接模式/桥接模式有什么用? 桥接模式(Bridge)是一种,让多个同类型的类与多个另外的同类型的类相 ...

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

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

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

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

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

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

  5. 策略模式和工厂模式的区别_java设计模式之状态模式,策略模式孪生兄弟

    状态模式 状态模式(State Pattern)中,类的行为是基于它的状态改变的,状态之间的切换,在状态A执行完毕后自己控制状态指向状态B,状态模式是不停的切换状态执行.这种类型的设计模式属于行为型模 ...

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

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

  7. Android设计模式之——状态模式

    一.介绍 状态模式中的行为是由状态来决定的,不同的状态下有不同的行为.状态模式和策略模式的结构几乎完全一样,但它们的目的.本质却完全不一样.状态模式的行为是平行的.不可替换的,策略模式的行为是彼此独立 ...

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

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

  9. 状态模式(Unity中使用)

    说明: Context(状态拥有者):是一个具有"状态"属性的类,可以定制相关的接口,让外界能够得知状态的改变或者通过操作让状态改变. State(状态接口类):制定状态的接口,负 ...

最新文章

  1. T4 (Text Template Transformation Toolkit)实现简单实体代码生成
  2. 【数据库】阿里云教你快速掌握SQL语句使用
  3. python中queue使用_在python2.6中使用Queue类
  4. 数据可视化(BI报表的开发)第三天
  5. php如何打出的正方形行列,javascript实现输出指定行数正方形图案的方法
  6. hadoop--HDFS的读写数据流程
  7. sql 过滤空值_图解 SQL,这简直太形象了吧!
  8. 对于.net开发的程序谷歌输入法输入优于搜狗
  9. 高德地图——一款功能强大的APP
  10. python支持xp32位系统吗_关于python在64位机器上打包32位exe(兼容xp系统)解决方法
  11. Unity中文API文档离线下载
  12. 如何优化你的ERP库存管理系统
  13. intersystem-M语言基础语法
  14. [复变函数]第20堂课 5.4 整函数与亚纯函数的概念
  15. 个人网站建设流程攻略
  16. javascript 的alert()功能 prompt() 功能
  17. PayPal接口开发
  18. Android笔记:将布局转换成图片
  19. process on绘图教程
  20. 命令控制qq自动申请远程控制_代码详解

热门文章

  1. 工作累了,也要休息一下了,交个朋友总是好的
  2. 2016年家电市场盘点:市场重构之年
  3. 因果关系的倒置(1)
  4. Android禁止输入表情符号
  5. python subprocess.Popen的使用
  6. JS学习日志15 -- JS基础--忍者代码
  7. 天龙八部之---看虚竹一生
  8. 解决用Xshell工具通过ssh登陆linux操作系统提示找不到匹配的host key算法问题
  9. oracle DCL包括,ORACLE笔记(6)SQL 语言之DCL语句
  10. linux基础命令行操作【1】