状态模式(State Pattern),又称为状态对象模式(Pattern of Objects for Statues),状态模式是对象的行为模式。
状态模式把所研究的对象的行为包装在不一样的状态对象里,每个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。
模式所涉及角色有:
1.抽象状态角色:定义接口,用以封装环境(Context)对象的一个特定的状态所对应的行为
2.具体状态角色:每个具体状态类都实现了环境(Context)的一个状态所对应 的行为
3.环境(Context)角色:定义客户端所感兴趣的接口,而且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态。
示例代码:
1 public class Test {
2
3 }
4 //环境角色,此例只给出一个具体状态类或接口,实际状况中会有不少具体状态类,也就是环境类Context的行为sampleOperation()是委派给一个具体状态
5 //类的。经过多态性原则,能够动态地改变环境类Context的属性State的内容,使其从指向一个具体状态类变换到指向另外一个具体状态类,从而使环境类的行
6 //行为sampleOperation()由不一样的具体状态类来执行。
7 class Context{
8 private State state;
9 public void sampleOperation(){
10 state.sampleOperation();
11 }
12 public void setState(State state){
13 this.state = state;
14 }
15 }
16
17 //抽象状态角色
18 interface State{
19 public void sampleOperation();
20 }
21 //具体状态角色
22 class ConcreteState implements State{
23
24 @Override
25 public void sampleOperation() {
26 System.out.println("Operation");
27 }
28
29 }
什么状况下使用状态模式?
1.一个对象的行为依赖于它所处的状态,对象的行为必须随着其状态的改变而改变
2.对象在某个方法里依赖于一重或多重的条件转移语句,其中有大量的代码状态模式把条件转移语句的每个分支都包装到一个单独的类里。这使得这些条件转移分支可以以类的方式独立存在和演化。维护这些独立的类也就再也不影响到系统的其余部分。
状态模式常常与策略模式相混淆,有时候很难区分。这时,一个简单的方法即是考察环境角色是否有明显的状态和状态的过渡。环境角色只有一个状态,那么就应当使用策略模式。策略模式的特色是:一旦环境角色选择了一个具体策略类,那么在整个环境类的生命周期里它都不会改变这个具体策略类。而状态模式则适用于另外一种状况,即环境角色有明显的状态转移。在环境类的生命周期里面,会有几个不一样的状态对象被利用。另外一个区别在于,策略模式的环境类本身选择一个具体策略类,而状态模式的环境类是被外在缘由放进一个具体状态中。策略模式所选的策略每每并不明显地告诉客户端它所选择的具体策略:而状态模式则相反,在状态模式里,环境角色所处的状态是明显告诉客户端的。
对象在不一样的状态下的行为包装到不一样的状态类里面,这是状态模式所要求的。状态模式所不指明的是控制状态转移的逻辑放在那里。在实现时,这种逻辑能够放在两个地方:一是放在环境类里面,二是包装在状态类里面。状态对象 本身决定什么时候进行状态转移,以及下一个状态是谁。