状态模式(State Pattern)是设计模式的一种,属于行为模式。
定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。
意图:允许一个对象在其内部状态改变时改变它的行为
适用场景:
1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
2.一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。
优缺点
A、它将与特定状态相关的行为局部化,并且将不同状态的行为分割开来
B、它使得状态转换显式化
C、State对象可被共享
D、状态模式的使用必然会增加系统类和对象的个数
E、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱
策略模式和状态模式
这两个模式的类图是类似的,它们的差别在于它们的意图。
策略模式是围绕可以互换的算法来创建成功业务的,而状态模式通过改变对象内部的状态来帮助对象控制自己的为。
策略模式中,客户通常主动指定Context所要组合的策略对象时哪一个。
策略模式让我们具有弹性,能够在运行时改变策略,但对于某个context对象来说,通常都只有一个最适当的策略象。
状态模式中,我们将一群行为封装在状态对象中,context的行为随时可以委托到那些状态对象中的一个。随着时间的流逝,当前状态在状态对象集合中游走改变,以反映出context内部的状态,因此,context的行为也会跟着改变。
但是context的客户对于状态对象了解不多,甚至根本是浑然不觉。
一般来说,我们把策略模式想成是除了继承之外的一种弹性替代方案。如果你使用继承定义了一个类的行为,你将被这个行为困住,甚至要修改它都很难。
有了策略模式,你可以通过组合不同的对象来改变行为。
我们把状态模式想成是不用在context中放置许多条件判断的替代方案。
通过将行为包装进状态对象中,你可以通过在context内简单地改变状态对象来改变context的行为。