不同的状态,不同的行为;或者说,每个状态有着相应的行为.
二、State模式的适用场合:
State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了.
三、State模式与Command模式的比较:
前者从调用者和被调用者的角度出发,目的是封装被调用者的行为,让调用者只和统一的顶层接口打交道。后者从对象自身的状态出发,不涉及调用者和被调用者。是对象自身的状态切换导致的行为变化。
四、“开关切换状态” 和“ 一般的状态判断”区别:
“开关状态切换”经常发生在GUI界面的交互过程中,通过结合对象当前状态和参数,判断接下来对象应该切换到什么状态。被判断对象和被更新对象都是同一个。这一点和“一般的状态判断”是不同的,后者是根据其它对象或属性的值来更新自身的状态。被判断对象和被更新对象不是同一个。
例如:if (which==1) state="hello";
else if (which==2) state="hi";
else if (which==3) state="bye";
这是一个 " 一般的状态判断",state值的不同是根据which变量来决定的,which和state没有关系.如果改成:
if (state.euqals("bye")) state="hello";
else if (state.euqals("hello")) state="hi";
else if (state.euqals("hi")) state="bye";
这就是 "开关切换状态",是将state的状态从"hello"切换到"hi",再切换到""bye";再切换到"hello",好象一个旋转开关,这种状态改变就可以使用State模式了.
五、State模式的构成:
1.state manager 状态管理器,就是开关,如上面例子的Context实际就是一个state manager, 在state manager中有对状态的切换动作.
2.用抽象类或接口实现的父类,,不同状态就是继承这个父类的不同子类(也就是不同的状态行为)
六、State模式的例子:状态机--父类定义
publicabstractclassState
{//状态行为的父类
//状态机需要能够感知上下文的情况,也就是之前的状态和目前的情形,所以用Context作为参数
public abstract void handlepush(Context c);
public abstract void handlepull(Context c);
publicabstractvo