ZPY博客

设计模式总结之状态模式(State Pattern)

状态模式允许对象在内部状态改变时改变它的行为。单看这个定义可能不太理解,结合一个例子来说明会比较好理解。假设现在有一个糖果机,需要投入硬币后才能转动摇杆,转动摇杆后可以随机出来一颗糖。投入硬币没有转动摇杆时可以退回硬币。看到这个需求,我想很多人都会觉得很简单,一上来肯定就是建一个类,然后把新建几个方法,分别对应投入硬币,退回硬币,转动摇杆这几个操作。然后分别在这几个方法里判断有没有投入硬币啊,是否能转动摇杆啊,是否能退回硬币啊之类的if判断。这样一来每个方法里会有大量的if判断,而且如果现在要新加一个状态,我们必须在每个方法里多加一个if判断,难以维护。

而状态模式的做法是,把所有状态都单独提出来作为一个类,在上面这个例子中,一共有4个状态,分别是没有投币的状态,已投入硬币的状态,已转动摇杆的状态,售罄的状态。因为糖果机都有投入硬币,退回硬币,转动摇杆这些操作,所以把这些操作定义到一个接口里,状态类都来实现这个接口,这样每个状态下进行这些操作都是特定的,不需要再写if判断。而这时我们如果要再加一个状态,只需要新建一个状态类,不需要修改原来的代码。这样就遵守了开放(易于扩展)封闭(不修改原来的代码)原则。

策略模式时常会拿来和状态模式比较。它们之前最大的不同在于,策略模式是客户自己指定用哪一个策略,而状态模式则是对象内容状态自己改变时带来的行为变化,任何的状态改变都是预先定义好的。一般来说,我们把策略模式想成是除了继承之外的一种弹性替代方案。把状态模式想成是不用在context中放置许多条件判断的替代方案。