定义
状态对象模式,是对象的行为模式
对象在不同状态下的“行为”包装到不同的状态类里面
状态对象自己觉得合适进行状态转移
通过使用多态性原则,可以动态改变环境类Context的属性State的内容,使其从指向一个具体状态类变换到指向另一个具体状态类,从而使环境类的行为由不同的具体状态类来执行。
多态性是状态模式的核心,一个对象的行为取决于一个或多个动态变化的属性,外界事件来决定状态的转换。
UML图
角色
抽象状态角色:定义一个接口,用以封装环境对象的一个特定的状态所对应的行为。
public interface State {
void simpleOperation();
}
具体状态角色:每一个具体状态类都实现了环境的一个状态所对应的行为。
public class ConcreteState implements State {
@Override
public void simpleOperation() {
System.out.println("ConcreteState");
}
}
环境角色:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。
public class Context {
private State state;
public void setState(State state) {
this.state = state;
}
public void simpleOperation() {
state.simpleOperation();
}
}
优缺点
优点
1、枚举可能的状态,在枚举状态之前需要确定状态种类。
2、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。
3、免于大量的条件转换语句,使程序实际上更容易维护。
4、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。
缺点
会造成大量小的状态类,增加类和对象的个数。
什么时候使用
1.一个对象的行为依赖于它所处的状态,对象的行为必须随其状态的改变而改变。
2.对象在某个方法里依赖于一重或多重条件转移语句,其中有大量的代码。状态模式把条件转移语句的每一个分支都包装到一个单独的类里,这使得这些条件转移分支能够以类的方式独立存在和衍化。维护这些独立的类也就不再影响到系统的其他部分。
状态模式与策略模式
说实在的,它们俩非常像。
但是,即便是孪生兄弟也是有差别的。
策略模式
环境角色只有一个状态;
策略模式的环境类自己选择一个具体策略类;
策略模式所选的策略往往并不明显地告诉客户端它所选择的具体策略。
状态模式
环境角色有明显的状态转移,在环境类的生命周期里面,会有几个不同的状态对象被使用;
状态模式环境类被外在的原因放进一个具体状态中;
状态模式里,环境角色所处的状态是明显告诉给客户端的。
还有一个重要的差别:策略模式封装的是“算法”,状态模式封装的是“状态”。
附上一个图,孪生兄弟之间的对话