手机用户请
横屏
获取最佳阅读体验,REFERENCES
中是本文参考的链接,如需要链接和更多资源,可以关注其他博客发布地址。
平台 | 地址 |
---|---|
CSDN | https://blog.csdn.net/sinat_28690417 |
简书 | https://www.jianshu.com/u/3032cc862300 |
个人博客 | https://yiyuery.github.io/NoteBooks/ |
状态模式:允许对象在内部状态改变是改变它的行为,对象看起来好像修改了它的类。你需要在一个类中管理状态,状态模式提供了封装状态的技巧。
类设计
代码实践
模拟一个任务的状态变化
TaskState
public interface TaskState {
/**
* 执行
*/
void handle();
/**
* 获取状态
*/
void getStatus();
}
//准备状态
@Data
@AllArgsConstructor
public class PrepareState implements TaskState {
private TaskStateManagerContext context;
/**
* 执行
*/
@Override
public void handle() {
System.out.println("Task Preparing...");
context.setCurrentState(new RunningState(context));
}
@Override
public void getStatus() {
System.out.println(">>>>> PrepareState");
}
}
//运行状态
@Data
@AllArgsConstructor
public class RunningState implements TaskState {
private TaskStateManagerContext context;
/**
* 执行
*/
@Override
public void handle() {
System.out.println("Task running......");
}
@Override
public void getStatus() {
System.out.println(">>>>> RunningState");
}
}
//手动停止
@Data
@AllArgsConstructor
public class DirectStopState implements TaskState{
private TaskStateManagerContext context;
/**
* 执行
*/
@Override
public void handle() {
System.out.println("Task is stopping...");
context.setCurrentState(new FinishedState(context));
}
@Override
public void getStatus() {
System.out.println(">>>>> DirectStopState");
}
}
//等等...
@Data
public class TaskStateManagerContext {
TaskState prepareState;
TaskState finishedSate;
TaskState directStopState;
TaskState suspendState;
TaskState runningState;
private TaskState currentState;
public static void main(String[] args) {
TaskStateManagerContext context = new TaskStateManagerContext();
TaskState prepareState = new PrepareState(context);
//任务准备状态
context.setCurrentState(prepareState);
context.getCurrentState().handle();
//任务运行状态
context.getCurrentState().getStatus();
//进行下一个状态
context.getCurrentState().handle();
//手动干预状态
context.setCurrentState(new DirectStopState(context));
context.getCurrentState().handle();
//查询状态
context.getCurrentState().getStatus();
//Task Preparing...
//>>>>> RunningState
//Task running......
//Task is stopping...
//>>>>> FinishedSate
}
}
角色分析
TaskStateManagerContext:
上下文是一个类,拥有一些内部状态,用于状态的切换管理。内部一般会定义 request
方法,可以委托给对应的状态类来处理(本文示例中直接在main函数中展示的,未做区分)
TaskState
的接口定义了一个所有具体状态的共同接口,任何状态都实现这个相同的接口,这样依赖,状态之间可以互相替换
设计要点