状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。这个模式将状态封装成为独立的类,并将动作委托到代表当前状态的对象。使得行为会随着内部状态的改变而改变。封装基于状态的行为,并将行为委托到当前状态。
策略模式的类图与状态模式的类图是一样的。当它们的意图不一样:
以状态模式而言,我们将一群算法封装在状态对象中,context的行为随时可以委托到那些状态对象中的一个。随着时间的流逝,当前状态在状态对象集合中游走改变,以反映出context内部的状态。因此,context的行为也会随着变化。但是context的客户对于状态对象了解不多,甚至是浑然不觉。我们把状态模式想成是不用在context中放置许多条件判断的替代方案。通过在context内简单地改变状态对象来改变context的行为。
而以策略模式而言,客户通常主动指定context所要组合的策略对象是哪一个。对于某个context对象来说,通常都只有一个最适当的策略对象。一般来说,我们把策略模式想成是除了继承之外的一种弹性替代方案。如果你使用继承定义一个类的行为,你将被这个行为困住,甚至要修改它都难。有了策略模式,你可以通过组合不同的对象来改变行为。