设计模式 之 状态模式
概念
类的行为基于它的状态而改变
主体思想是将各种具体的状态类抽象出来。也就是会有很多状态类。
使用场景
- 代码中包含大量与对象状态有关的条件语句
- 行为随状态的改变而改变
特点
- 各个状态之间可以互相转换,比如工作流。
- 各个状态可以独立完成各自任务。
代码
代码场景
模仿工作流,目前有三个状态,分别为 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
码云
博客
https://my.oschina.net/gmarshal/blog/2875911
欢迎关注我的个人微信订阅号:(据说这个头像程序猿专用)