设计模式 之 状态模式
概念
类的行为基于它的状态而改变
主体思想是将各种具体的状态类抽象出来。也就是会有很多状态类。
使用场景
- 代码中包含大量与对象状态有关的条件语句
- 行为随状态的改变而改变
特点
- 各个状态之间可以互相转换,比如工作流。
- 各个状态可以独立完成各自任务。
代码
代码场景
模仿工作流,目前有三个状态,分别为 AState、BState、CState,且状态的流转过程为 AState -> BState -> CState
具体代码
状态抽象类 AbstractState
/** * 状态抽象类 * @author GaoYuan * @date 2018/11/11 上午8:42 */public abstract class AbstractState { /** 封装了上下文 */ protected Context context; public void setContext(Context context){ this.context = context; } /** 执行方法 */ abstract void run(); /** 切换至下一个状态 */ abstract void next();}
具体状态类
public class AState extends AbstractState { /** 执行方法 */ @Override public void run() { System.out.println("执行 AState 的 run() 方法"); } /** 切换至下一个状态 */ @Override void next() { System.out.println("执行 AState 的 next() 方法"); // 定义了下一个状态是 BState context.setState(new BState()); }}public class BState extends AbstractState { /** 执行方法 */ @Override public void run() { System.out.println("执行 BState 的 run() 方法"); } /** 切换至下一个状态 */ @Override void next() { System.out.println("执行 BState 的 next() 方法"); // 定义了下一个状态是 CState context.setState(new CState()); }}public class CState extends AbstractState { /** 执行方法 */ @Override public void run() { System.out.println("执行 CState 的 run() 方法"); } /** 切换至下一个状态 */ @Override void next() { System.out.println("执行 CState 的 next() 方法"); System.out.println("已经是最后一个状态了!"); }}
Context
/** * 上下文 * @author GaoYuan * @date 2018/11/11 上午8:16 */public class Context { private AbstractState state; public AbstractState getState() { return state; } /** 设置当前状态 */ public void setState(AbstractState state) { this.state = state; // 记得 setContext,不然会空指针 this.state.setContext(this); } /** 执行方法 */ public void run(){ this.state.run(); } /** 下一个状态 */ public void next(){ this.state.next(); }}
测试类
/** * 约定 状态的流转过程为 AState -> BState -> CState * @author GaoYuan * @date 2018/11/11 上午8:45 */public class TestMe { public static void main(String[] args){ Context context = new Context(); context.setState(new AState()); context.run(); System.out.println("当前状态:" + context.getState().toString()); context.next(); System.out.println("当前状态:" + context.getState().toString()); context.run(); System.out.println("当前状态:" + context.getState().toString()); context.next(); System.out.println("当前状态:" + context.getState().toString()); context.run(); System.out.println("当前状态:" + context.getState().toString()); context.next(); System.out.println("当前状态:" + context.getState().toString()); }}
输出
执行 AState 的 run() 方法当前状态:com.foruo.learn.designmode.state.AState@2503dbd3执行 AState 的 next() 方法当前状态:com.foruo.learn.designmode.state.BState@4b67cf4d执行 BState 的 run() 方法当前状态:com.foruo.learn.designmode.state.BState@4b67cf4d执行 BState 的 next() 方法当前状态:com.foruo.learn.designmode.state.CState@7ea987ac执行 CState 的 run() 方法当前状态:com.foruo.learn.designmode.state.CState@7ea987ac执行 CState 的 next() 方法已经是最后一个状态了!当前状态:com.foruo.learn.designmode.state.CState@7ea987ac
码云
博客
欢迎关注我的个人微信订阅号:(据说这个头像程序猿专用)