10.状态模式
状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
以状态模式而言,我们将一群行为封装在状态对象中,context的行为随时可委托到那些状态对象中的一个。随着时间的流逝,当前状态在状态对象集合中游走改变,以反映出context内部的状态,因此,context的行为也会跟着改变。但是context的客户对于状态对象了解不多,甚至根本是浑然不觉。
而以策略模式而言,客户通常主动指定context所要组合的策略对象是哪一个。现在,固然策略模式让我们具有弹性,能够在运行时改变策略,但对于某个context对象来说,通常都只有一个最适当的策略对象。一般来说,我们把策略模式想成是除了继承之外的一种弹性替代方案。如果你是用继承定义了一个类的行为,你将被这个行为困住,甚至要修改它都很难。有了策略模式,你可以通过组合不同的对象来改变行为。
我们把状态模式想成是不用在context中放置许多条件判断的替代方案。通过将行为包装进状态对象中,你可以通过在context内简单地改变状态对象来改变context的行为。
和程序状态机PSM不同,状态模式用类代表状态。Context会将行为委托给当前状态对象。通过将每个状态封装进一个类,我们把以后需要做的任何改变局部化了。状态模式和策略模式有相同的类图,但是它们的意图不同。策略模式通常会用行为或算法来配置Context类。状态模式允许Context随着状态的改变而改变行为。状态转换可以由State类或Context类控制。状态类可以被多个Context实例共享。