状态模式(State)
定义
当一个对象的内在状态改变时允许改变其行为,这个帝乡看起来像是改变了其类。
UML类图
例子
State
package com.csdhsm.pattemdesign.state;/** * @Title: State.java * @Description: 状态接口 * @author: Han * @date: 2016年6月24日 下午9:47:24 */ public interface State { public void handler(StateMachine state);}
Context
package com.csdhsm.pattemdesign.state;/** * @Title: StateMachine.java * @Description: 环境(Context)角色:给出此时的状态 * @author: Han * @date: 2016年6月24日 下午9:49:35 */ public class StateMachine { //当前的状态 private State currentState; public State getCurrentState() { return currentState; } public void setCurrentState(State currentState) { this.currentState = currentState; }}
开始状态
package com.csdhsm.pattemdesign.state;/** * @Title: StartState.java * @Description: 开始状态 * @author: Han * @date: 2016年6月24日 下午9:47:39 */ public class StartState implements State { @Override public void handler(StateMachine state) { System.out.println("start to process..."); //进入制作状态 state.setCurrentState(new MakeState()); }}
制作状态
package com.csdhsm.pattemdesign.state;/** * @Title: MakeState.java * @Description: 制作状态 * @author: Han * @date: 2016年6月24日 下午9:48:56 */ public class MakeState implements State { @Override public void handler(StateMachine state) { System.out.println("Makeing..."); //进入完成状态 state.setCurrentState(new CompletedState()); }}
完成状态
package com.csdhsm.pattemdesign.state;/** * @Title: CompletedState.java * @Description: 完成状态 * @author: Han * @date: 2016年6月24日 下午9:49:06 */ public class CompletedState implements State { @Override public void handler(StateMachine state) { System.out.println("complete..."); state.setCurrentState(null); }}
客户端
package com.csdhsm.pattemdesign.state;public class Solution { public static void main(String[] args) { StateMachine machine = new StateMachine(); State start = new StartState(); machine.setCurrentState(start); //一直更改状态,直到完成 while(machine.getCurrentState() != null) { machine.getCurrentState().handler(machine); } }}
结果
ok,成功!
总结
在状态模式中,环境(Context)是持有状态的对象,但是环境(Context)自身并不处理跟状态相关的行为,而是把处理状态的功能委托给了状态对应的状态处理类来处理。
在具体的状态处理类中经常需要获取环境(Context)自身的数据,甚至在必要的时候会回调环境(Context)的方法,因此,通常将环境(Context)自身当作一个参数传递给具体的状态处理类。
客户端一般只和环境(Context)交互。客户端可以用状态对象来配置一个环境(Context),一旦配置完毕,就不再需要和状态对象打交道了。客户端通常不负责运行期间状态的维护,也不负责决定后续到底使用哪一个具体的状态处理对象。
引用资料:http://www.cnblogs.com/BenWong/archive/2012/12/12/2813982.html http://www.cnblogs.com/java-my-life/archive/2012/06/08/2538146.html