概述
属于行为型模式
对象需要根据自身当前的状态进行不同行为,状态数量多且状态相关的代码频繁变更
在一个对象的内部状态变化时改变其行为,使其看上去就像改变了自身所属的类一样
组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一问题提供了一种解决方案
经典模式:state, memento
state模式:某些对象的状态如果改变,其行为也会随之变化,如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同
如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转化间引入紧耦合?
类似于strategy模式,解决if-else带来的业务判断问题,未来有新状态怎么办?(多态,运行时改变)
先提出抽象基类,将状态有关的操作变成状态对象的虚函数,再设计不同状态对应的类
虚函数本质:运行时的 if-else
将所有与一个特定状态相关的行为放入一个state的子类对象,在状态切换时切换成相应的对象,但同时维持state接口,实现了具体操作与状态转换间的解耦
为不同状态引入不同对象使得状态转换变得更加明确,且可以保证不会出现状态不一致的情况,因为转换是原子性的(彻底转换过来或者不转换)
若state对象没有实例变量,那么上下文可以共享一个对象,从而节省对象开销
每个状态只关心自己的后继状态
场景
对象行为随状态改变而改变
结构
上下文类:保存对一个具体状态对象的引用,并将所有与该状态相关的工作委派给它
状态接口:声明特定于状态的方法
具体状态类:实现特定于状态的方法
示例1
state1.cpp
view code
state2.cpp
示例2
示例3
player is in start state
start state
player is in stop state
stop state