天天看点

[设计模式] 设计模式课程(十五)-- 状态模式

概述

属于行为型模式

对象需要根据自身当前的状态进行不同行为,状态数量多且状态相关的代码频繁变更

在一个对象的内部状态变化时改变其行为,使其看上去就像改变了自身所属的类一样

组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一问题提供了一种解决方案

经典模式: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