1. 当一个对象的内在状态发生改变时,允许改变其行为,这个对象看起来像是改变了其类,状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖,当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式
2. 示例 :定义Work类,Work类中定义State状态,定义工作状态类State,WorkState、RestState分别为其工作状态、休息状态,调用work()时会调用State的handle()根据work当前状态执行对应的上班、工作行为
/**
* @author beck.yang
* @date 2022/7/5 11:17
* @description 工作类
*/
public class Work {
private State state;
private String week;
public Work(State state){
this.state = state;
}
public void work(){
this.state.handle(this);
}
public String getWeek() {
return week;
}
public void setWeek(String week) {
this.week = week;
}
}
/**
* @author beck.yang
* @date 2022/7/5 11:18
* @description
*/
public abstract class State {
public abstract void handle(Work work);
}
/**
* @author beck.yang
* @date 2022/7/5 11:22
* @description
*/
public class WorkState extends State{
private static final List<String> workWeeks = Arrays.asList(
"周一",
"周二",
"周三",
"周四",
"周五"
);
@Override
public void handle(Work work) {
if (workWeeks.contains(work.getWeek())) {
System.out.println(work.getWeek() + "上班中....");
}else {
RestState restState = new RestState();
restState.handle(work);
}
}
}
/**
* @author beck.yang
* @date 2022/7/5 11:22
* @description
*/
public class RestState extends State{
@Override
public void handle(Work work) {
System.out.println(work.getWeek() + "休息中...");
}
}
/**
* @author beck.yang
* @date 2022/7/5 11:26
* @description 状态模式
*/
public class Main {
public static void main(String[] args) {
State initState = new WorkState();
Work work = new Work(initState);
work.setWeek("周三");
work.work();
work.setWeek("周四");
work.work();
work.setWeek("周六");
work.work();
work.setWeek("周日");
work.work();
}
}