读《大话设计模式》之状态模式

一、模式概述

在很多情况下,一个对象的行为取决于它的一个或多个变化的属性,这些属性我们称之为状态,这个对象称之为状态对象
对于状态对象而言,它的行为依赖于它的状态。
这样的一个对象,当它在于外部事件产生互动的时候,其内部状态就会发生改变,从而使得他的行为也随之发生改变
所谓状态模式就是允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。

没图说个文明你我他。

UML 图

状态模式结构图
1.State 类:抽象状态类,定义一个接口封装与 Context 状态相关的行为(所以依赖 Context 类)。
2.ConcreteState 类:具体状态类,实现一个具体的状态的行为。
3.Context 类:具体的实例,他定义当前的状态,持有 State 状态类(所以是聚合关系)。

二、模式优缺点

优点

1.允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。 2.将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。

缺点

1、状态模式的使用必然会增加系统类和对象的个数。
2、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。
3、状态模式对“开闭原则”的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态;而且修改某个状态类的行为也需修改对应类的源代码。

三、模式适用场景

1、对象的行为依赖于它的状态并且可以根据它的状态改变而改变它的相关行为。
2、代码中包含大量与对象状态有关的条件语句

四、模式总结

我的理解就是状态模式利用实例类和状态类之间的关系来代替过多 的 if else 状态转换逻辑,实现拓展性、可维护性。