模式动机
- 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的对象,这样的对象状态是从实现定义好的一系列值中取出的,当一个这样的对象与外部实际产生互动时,其内部状态就会发生改变,从而行为也随之改变。
模式定义
- 状态模式(State Pattern):允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。是一种对象行为型模式。
模式结构

- Context:环境类
- State:抽象状态类
- ConcreteState:具体状态类
模式分析
- 状态模式描述了对象状态的变化以及对象如何在每一种状态下表现出不同的行为。
- 状态模式的关键是引入了一个抽象类来专门表示对象的状态,这个类我们叫做抽象状态类,而对象的每一种具体状态类都继承了该类,并在不同具体状态类中是心啊了不同状态行为,包括各种状态之间的转换。
模式实例
- 现在You是一个有状态的对象,You有两种状态,一种是恋爱了去约会还有一种是失恋了去喝酒。
public class You {
private State state;
public void setState(State state) {
this.state = state;
}
public void behavior(){
state.handle();
}
}
public interface State {
void handle();
}
class ConcreteState1 implements State{
@Override
public void handle() {
System.out.println("失恋了去喝酒");
}
}
class ConcreteState2 implements State{
@Override
public void handle() {
System.out.println("恋爱了去约会");
}
}
模式优缺点
- 优点
- 封装了转换规则
- 很方便的增加新的状态
- 可以让多个环境对象共享一个状态对象
- 缺点
- 状态模式的使用必然会增加系统类和对象的个数
- 对“开闭原则”的支持并不好,若新增某个状态类,可能会修改某源代码
模式应用
- 在工作流或游戏等类型的软件中得以广泛使用
- 目前流行的RPG,角色扮演游戏中,使用状态模式可以对游戏角色进行控制,游戏角色的升级伴随着其状态的变化。