目录
1.模式动机
在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的 (stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的。当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统的行为也随之发生变化。
在UML中可以使用状态图来描述对象状态的变化。例如人的情绪就可以使用状态图来描述对象状态的变化。
将“开心”和“伤心”两种情绪从类“人”中分离出来,从而避免在“人”中进行状态的判断和转换,将拥有状态的对象和状态对应的行为分离,这就是状态模式的动机
2.模式定义
状态模式(State Pattern) :允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象(Objects for States),状态模式是一种对象行为型模式。
3.模式结构
状态模式包含如下角色:
Context: 环境类
State: 抽象状态类
ConcreteState: 具体状态类
4.模式分析
状态模式描述了对象状态的变化以及对象如何在每一种状态下表现出不同的行为。 状态模式的关键是引入了一个抽象类来专门表示对象的状态,这个类我们叫做抽象状态类,而对象的每一种具体状态类都继承了该类,并在不同具体状态类中实现了不同状态的行为,包括各种状态之间的转换。
某酒店订房系统,将房间设计为一个类,那么房间对象存在已预订、空闲、已入住等状态。这些状态之间可以相互转换,不同状态的对象还可能具有不同的行为。如已预订或有客人的房间就不能再接受其他顾客的预订,而空闲的房间可以接受预订。状态图如下所示:
如果不使用状态模式,在环境类房间中可能存在如下示例代码片段: