状态模式State

原创 2018年04月16日 17:18:07

状态模式:

    当一个对象的行为取决于它的状态,并且在输入事件或者随着时间的推移会改变对象的状态。那么就把行为封装到状态中,为每一个状态设计一个类。

   例子:

        根据玩家的输入来控制主角的行为--《游戏编程模式》

        糖果机的实现,根据顾客的操作来控制糖果机的行为--《HeadFirst设计模式》

        均可以画一个状态转移图


状态模式类图:


concreteStateA 与 ConcreteStateB 之间的状态转化对 Context 是透明的,Context只知道初始状态和当前状态,对如何转化状态并不知道。


状态模式设计流程

        1.定义状态接口,每一个与状态相关的行为都定义为虚函数。【State。

        2.为每一个具体状态定义一个类继承自状态接口,并实现具体的行为。【ConCreteState

        3.把对象的行为委托给当前状态的行为。【Context的request委托给state的handle()

                玩家的handleInput 调用 curState的handleInput

                糖果机的InsertQuarter 调用 curState的InsertQuarter


状态对象的生成方式

1.静态状态

        限制:状态中不能含有自己的数据成员。

        优点:多个context对象可以共享状态。

                   在state.handle 需要把context作为参数传入 state.handle(context* )

2.实例化状态

        1)由context实例化,拥有所有的状态实例。当前状态是这些实例之一。(每个状态可以拥有一个context指针数据成员,handle的时候就不需要传入context指针了)

        2)由具体状态类 动态创建新状态,由context销毁旧状态。



状态模式的缺点

1) 状态模式的使用必然会增加系统类和对象的个数。

2) 状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱


先判断输入,再判断当前所处的状态,根据状态做出行为。

vs

先判断当前状态,再判断输入的是什么,再根据输入做出行为。

vs

把状态设计成类,把根据输入做出行为设计成类的函数。


与策略模式比较

同:类图一致。均有主对象的行为委托给附属对象

异:目标不同:

          策略模式的目标是将主类与它的部分行为进行解耦。  策略模式中主动制定context所要组合的【策略对象】。

          状态模式的目标是通过改变主对象代理的对象来改变主对象的行为。状态模式中context对于【状态对象】的改变了解不多,而是由【状态对象】去控制状态转换。  


策略模式 --- 除了继承之外的一种弹性替代方案。

状态模式 --- 不用在context中防止许多条件判断的替代方案。


参考资料

《headfirst设计模式》

《游戏编程模式》

设计模式(8):行为型-状态模式(State)

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于...
  • houxuehan
  • houxuehan
  • 2018-04-11 11:55:25
  • 22

设计模式学习之状态模式:请假流程

工作流中的请假流程 某人提出请假申请,先由项目经理审批,如果项目经理不同意,审批就直接结束 如项目经理同意,再看是否超过3天,如果三天以内,审批直接结束 否则,交给部门经理,部门经理审核后,无论...
  • u014293306
  • u014293306
  • 2015-06-01 20:12:08
  • 726

状态模式的实例学习

上篇博客介绍了策略模式的实例使用,这篇博客介绍一下状态模式的实例使用。 1.状态模式是解决什么问题的? 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况,把状态的判断逻辑转移到表示...
  • wangyajin333
  • wangyajin333
  • 2014-01-22 21:45:19
  • 768

让应用停留在后台模式的三种方式

一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间。 还有三种类型的可以运行在后台, 1.音乐 2.location 3.voip 大多数应用程序进入后台状...
  • shanchelicun
  • shanchelicun
  • 2015-07-20 09:44:16
  • 688

设计模式之十 --- 状态(State)模式

【1】基本概念          状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。【2】简单分析         我们先来看下该设计模式的UML的结构图...
  • cjjky
  • cjjky
  • 2012-05-20 19:04:00
  • 15786

Java设计模式——状态模式(STATE PATTERN)

场景一 描述:现在城市发展很快,百万级人口的城市一堆一堆的,那其中有两个东西的发明在城市的发展中起到非常重要的作用:一个是汽车,一个呢是...,猜猜看,是什么?是电梯!汽车让城市可以横向扩展,电梯让城...
  • u012401711
  • u012401711
  • 2016-09-26 23:45:36
  • 4711

《大话设计模式》java实现之状态模式

状态模式、策略模式、责任链模式三者非常像,今天花了很多时间查找他们之间的不同,博客https://www.cnblogs.com/xibei666/p/6858145.html总结得很好,这里简单总结...
  • linlinxie
  • linlinxie
  • 2017-11-17 16:09:44
  • 189

层次状态机

出处:http://xlambda.com/blog/2014/11/04/hierarchical-state-machine/ 计算机程序是写给人看的,只是顺便能运行。 —— 《计算机...
  • wuhenyouyuyouyu
  • wuhenyouyuyouyu
  • 2016-11-30 14:48:22
  • 2784

设计模式 -- 状态模式(State)

理解 状态模式一般运用在一个对象在某些条件下能触发一些不同的行为的情形。其实系统开发中到处都充斥着这些情形,初学者往往都是习惯性的用面向过程的思维方式解决问题,往往看到模块中if .. else .....
  • u010223072
  • u010223072
  • 2016-06-26 15:39:45
  • 2534

状态模式State(对象行为型)

转自:http://blog.csdn.net/hguisu/article/details/7557252 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理...
  • song_hui_xiang
  • song_hui_xiang
  • 2016-02-17 10:40:19
  • 848
收藏助手
不良信息举报
您举报文章:状态模式State
举报原因:
原因补充:

(最多只允许输入30个字)