引言

使用该设计模式的情况:如在场景中的主角甚至是敌人,有N个不同状态:走路,攻击,待机.....,游戏中,这些状态来回切换。有一个明确的状态划分的情况下,此时,是可以使用Switch...case...来整理不同的状态的切换和处理的,但处理不同状态,包括切换逻辑会比较冗杂,还有一个缺点就是不容易扩展; 这种情况下,利用状态模式是比较好的。

2,解决的问题:

  • 当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式来。
  •   当一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态。
  •   当控制一个对象状态转换的条件表达式过于复杂的情况。把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。不仅仅是使用人物状态和AI 这块,如当游戏中有诸多场景要进行切换的时候,亦是可以使用该模式的。

3,类图

  声明一个接口,以封装状态的相关行为,对这个接口来说,会有实现类(有几个状态就实现几个);  

若状态间进行切换只需要在Context(对象,状态拥有者),只需要在context中的State指向对应状态即可;

  

4,优缺点

  •     状态模式将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
  •     所有状态相关的代码都存在于某个ConcereteState中,所以通过定义新的子类很容易地增加新的状态和转换。
  •       状态模式通过把各种状态转移逻辑分不到State的子类之间,来减少相互间的依赖。

缺点是会有很多的状态子类。

5,示例代码

  

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 状态模式
/// </summary>
public class StateModel:MonoBehaviour
{private void Start(){Context ct = new Context();ct.SetState(new ConcreteA(ct));//changect.Handle(3);ct.Handle(5);}
}
//状态应用者 Context
public class Context
{private Istate mState;// public void  SetState(Istate state){mState = state;} public void Handle(int args){mState.Hanedle(args);}}
public interface Istate
{void Hanedle(int args);
}
public class ConcreteA : Istate
{private Context mContext;public ConcreteA (Context context){mContext = context;}public void Hanedle(int args){Debug.Log("ConcreteA:" + args);      if (args > 4){mContext.SetState(new ConcreteB(mContext));}}
}
public class ConcreteB : Istate
{private Context mContext;public ConcreteB(Context context){mContext = context;}public void Hanedle(int args){Debug.Log("B:" + args);if (args < 4){mContext.SetState(new ConcreteA(mContext));}}
}

  控制台结果

    

转载于:https://www.cnblogs.com/allyh/p/9396389.html

设计模式学习笔记-状态模式相关推荐

  1. 设计模式学习笔记——状态(State)模式框架

    设计模式学习笔记--状态(State)模式框架 @(设计模式)[设计模式, 状态模式, State] 设计模式学习笔记状态State模式框架 基本介绍 状态案例 类图 实现代码 State接口 Day ...

  2. 设计模式 - 学习笔记 - 工厂模式Factory Pattern

    设计模式 - 学习笔记 - 工厂模式Factory Pattern 1. 简单工厂 1.1 应用场景 1.2 UML 1.3 优劣分析 好处 缺点 1.4 代码示例 抽象产品 AbstractProd ...

  3. 《Head First 设计模式》学习笔记——状态模式

    在软件开发过程中.应用程序可能会依据不同的情况作出不同的处理. 最直接的解决方式是将这些全部可能发生的情况全都考虑到.然后使用if... ellse语句来做状态推断来进行不同情况的处理. 可是对复杂状 ...

  4. 设计模式学习笔记——外观模式

    外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这种模式涉及 ...

  5. 设计模式学习笔记-原型模式

    一.概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象: 二.模式中的角色 Prototype:声明一个克隆自身的接口: ConcretePrototype:实现一个克隆自身的操作: ...

  6. 设计模式学习笔记-中介模式

    概述:                                                                                                 ...

  7. 设计模式学习笔记——命令模式(Command)

    1.特点:将请求发送者与具体实现者解耦,可对请求排列.取消.重做,支持事务.(多请求,单处理) 2.概念:属于对象的行为模式[GOF95].命令模式又称为行动(Action)模式或交易(Transac ...

  8. 设计模式学习笔记-代理模式

    1. 概述 为其它对象提供一种代理以控制对这个对象的访问. 解决的问题:如果直接访问对象比较困难,或直接访问会给使用者或系统带来一系列问题.这样对于客户端(调用者)来说,就不需要直接与真实对象进行交互 ...

  9. 设计模式学习笔记——命令模式

    请求发送者与请求接收者之间,隔着一个命令,这就是命令模式. 为什么要在中间搞一个命令对象作为中介? 请求发送者直接调用接收者不行吗?如果为方便替换,符合开闭原则,可以针对接口编程,弄一个请求接收者接口 ...

最新文章

  1. 中国批准AMD收购赛灵思!苏妈花350亿美元集齐CPU\GPU\FPGA三大芯片业务
  2. 喂,你连用户模型都不懂还当产品?来,妹纸我手把手教你
  3. hashmap 不释放空间_刁难问题,为什么HashMap默认容量为16加载因子为0.75
  4. vs2019配置OpenGL
  5. 火灾原来离我们那么近
  6. 无名接口.php,李无名
  7. Xcode 6 免证书真机调试
  8. C++ 访问成员 “->“还是“.“
  9. mfc 通过按钮发弹幕_BiliBiliChat
  10. c4isr系统有无服务器,什么是C4ISR系统?
  11. 2020淘宝双十一快速刷金币工具
  12. 安全架构--10--企业安全防御体系建设总结
  13. 您未被授权查看该页 错误 401.3
  14. BIOS INT中断整理
  15. CodeUp-1036 Problem B 镂空三角形
  16. SSD固态硬盘能否恢复--争议
  17. Oracle latch: cache buffers chains
  18. SpringBoot项目中怎么保证提供的接口不会被调崩
  19. 电子工程师名片——UFI Command,USB盘符的显示
  20. 2020年中国云计算市场需求及云厂商投资情况分析[图]

热门文章

  1. PyQt5 技术篇-QComboBox下拉框绑定监听事件实例演示
  2. Spring - IOC常用标签
  3. stm32之通用定时器
  4. vba中的查找匹配函数
  5. 1.3 matlab常用的内部数学函数
  6. java8 lambda 排序算法,Java8中排序算法比较器的三种写法(使用lambda表达式实现Comparator比较器)...
  7. Tensorflow学习教程集合
  8. new Scanner(1.txt);读取不到文件中的数据
  9. 使用栈结构实现中缀转后缀算法(python)
  10. 第一章:1.2.1系统建模