状态模式:如果把一段可比较的长度作判断比较并多不同的事情(比如:某段时间干什么事),使用状态模式来替代多重if --else if,需要有状态抽象类、状态实现类、做事情类
抽象状态类:
public abstract class State {
public abstract void doit(Work work);
}
状态的实现类:
//早上
public class MorningState extends State {
@Override
public void doit(Work work) {
if (work.getTime() < 12) {
System.out.println("现在早上,感觉好精神!");
} else {
work.setState(new NoonState());
work.doit();
}
System.out.println();
}
}
//中午
public class NoonState extends State {
@Override
public void doit(Work work) {
if (work.getTime() <= 12 ) {
System.out.println("中午时间,吃顿饭再说!");
} else {
work.setState(new AfternoonState());
work.doit(); // 把新建的状态拿去做判断
}
}
}
//下午
public class AfternoonState extends State {
@Override
public void doit(Work work) {
if (17 > work.getTime()) {
System.out.println("下午时间,困得一批啊");
} else {
work.setState(new EveningState());
work.doit(); // 把新的状态传给要做的事情
}
}
}
//晚上+深夜
public class EveningState extends State {
@Override
public void doit(Work work) {
if (work.getTime() < 23) {
System.out.println("下班时间,high起来!");
}else{
System.out.println("夜深了还扣毛码");
}
}
}
做事情类:
public class Work {
private State state;// 目前的状态
private int time; // 时间,作为判断不同状态的依据
public Work() {
state = new MorningState(); // 初始状态
}
public int getTime() {
return time;
}
public void setTime(int time) {
this.time = time;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public void doit() {
state.doit(this); // 传递当前新实例给当前状态判断
}
}
客户端:
public class Client {
public static void main(String[] args) {
Work w1 = new Work();
w1.setTime(11);
w1.doit();
Work w2 = new Work();
w2.setTime(12);
w2.doit();
Work w3 = new Work();
w3.setTime(16);
w3.doit();
Work w4 = new Work();
w4.setTime(19);
w4.doit();
Work w5 = new Work();
w5.setTime(24);
w5.doit();
}
}
执行结果:
现在早上,感觉好精神!
中午时间,吃顿饭再说!
下午时间,困得一批啊
下班时间,high起来!
夜深了还扣毛码
状态模式:在一个类改变了自己内在的状态时候,对应的行为也会跟着改变;状态要需要有判断的依据,比如:时间;