1. 概念
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
2. 创建状态抽象类
/**
* @author zlc
* @created 2017/12/24
*/
public abstract class State {
public abstract void writeProgram(Work work);
}
3. 创建具体状态类继承状态抽象类
1.早上状态
/**
* @author zlc
* @created 2017/12/24
*/
public class ForenoonState extends State{
@Override
public void writeProgram(Work work) {
if(work.getHour() <= 12){
System.out.println("当前时间:"+work.getHour()+"点 上午工作,精神百倍");
}else{
work.setState(new NoonState());
work.writeProgram();
}
}
}
2.中午状态
/**
* @author zlc
* @created 2017/12/24
*/
public class NoonState extends State{
@Override
public void writeProgram(Work work) {
if(work.getHour() <= 14){
System.out.println("当前时间:"+work.getHour()+"点 饿了,午饭,犯困,午休");
}else{
work.setState(new AfternoonState());
work.writeProgram();
}
}
}
3.下午状态
/**
* @author zlc
* @created 2017/12/24
*/
public class AfternoonState extends State{
@Override
public void writeProgram(Work work) {
if(work.getHour() <= 18){
System.out.println("当前时间:"+work.getHour()+"点 下午状态还行,继续努力");
}else{
work.setState(new EveningState());
work.writeProgram();
}
}
}
4.晚上状态
/**
* @author zlc
* @created 2017/12/24
*/
public class EveningState extends State{
@Override
public void writeProgram(Work work) {
if(work.isFinish()){
System.out.println("当前时间:"+work.getHour()+"点 工作完成了,下班!");
}else{
if(work.getHour() <= 21){
System.out.println("当前时间:"+work.getHour()+"点 加班 ,累成傻逼");
}else{
work.setState(new SleepingState());
work.writeProgram();
}
}
}
}
5.睡觉状态
/**
* @author zlc
* @created 2017/12/24
*/
public class SleepingState extends State{
@Override
public void writeProgram(Work work) {
System.out.println("当前时间:"+work.getHour()+"点 不行了,眼皮子打架了");
}
}
4.创建工作类
/**
* @author zlc
* @created 2017/12/24
*/
public class Work {
private State currentState;
private int hour;
private boolean isFinish = false;
public Work(){
currentState = new ForenoonState();
}
public void setHour(int hour) {
this.hour = hour;
}
public int getHour() {
return hour;
}
public boolean isFinish() {
return isFinish;
}
public void setFinish(boolean finish) {
isFinish = finish;
}
public void setState(State state) {
this.currentState = state;
}
public void writeProgram(){
currentState.writeProgram(this);
}
}
5. 测试类
@org.junit.Test
public void test(){
Work work = new Work();
work.setHour(9);
work.writeProgram();
work.setHour(12);
work.writeProgram();
work.setHour(16);
work.writeProgram();
work.setHour(18);
work.writeProgram();
work.setFinish(false);
work.setHour(20);
work.writeProgram();
work.setHour(22);
work.writeProgram();
}
6.小结
将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变
它的行为时,就可以考虑使用状态模式了。