状态模式
定义
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的问题就是当控制一个对象状态转换的条件表达式过于复杂时的情况。即把状态的判断逻辑转移到标识不同状态的一系列类当中。可以把复杂的判断逻辑简化。
当一个对象的行为取决于他的状态,并且它必须在运行时刻根据状态改变它的行为。这个时候可以考虑使用状态模式。
好处
将与特定状态相关的行为放入一个对象中,并且将不同状态的行为分割开来(局部化),通过把各种状态转移逻辑分布到子类之间,减少相互间的依赖。
UML图
用例
工作类
public class Work{
private State current;
private double hour;
private boolean finish = false;
public Work(){
//工作初始化为上午状态 即上午九点开始上班
this.current = new ForenoonState();
}
public double getHour(){
return hour;
}
public void setHour(double hour){
this.hour = hour;
}
public boolean getFinish(){
return finish;
}
public void setFinish(boolean finish){
this.finish = finish;
}
public State getCurrent(){
return current;
}
public void setCurrent(State current){
this.current = current;
}
public void WriteProgram(){
current.WriteProgram(this);
}
}
抽象状态类
public abstract class State{
public abstract void WriteProgram(Work w);
}
上午工作状态
public class ForenoonState extends State{
@Override
public void WriteProgram(Work w){
if(w.getHour() < 12){
System.out.println("当前时间: " + w.getHour() + " 上午工作 精神百倍");
}
else{
w.setCurrent(new NoonState());//设置下一状态
w.WriteProgram();
}
}
}
中午工作状态
public class NoonState extends State{
@Override
public void WriteProgram(Work w){
if (w.getHour() < 13){
System.out.println("当前时间: " + w.getHour() + " 中午了 饿了 午饭 犯困 午休");
}
else{
w.setCurrent(new AfternoonState());
w.WriteProgram();
}
}
}
下午工作状态
public class AfternoonState extends State{
@Override
public void WriteProgram(Work w){
if (w.getHour() < 17){
System.out.println("当前时间: " + w.getHour() + " 下午工作 状态还不错 继续努力");
}
else{
w.setCurrent(new EveningState());
w.WriteProgram();
}
}
}
晚上工作状态
public class EveningState extends State{
@Override
public void WriteProgram(Work w){
if (w.isFinish()){
w.setCurrent(new RestState());
work.WriteProgram();
}
else{
if (w.getHour() < 21){
System.out.println("当前时间: " + w.getHour() + " 唉 加班哦 ");
}
else{
w.setCurrent(new SleepingState());
w.WriteProgram();
}
}
}
}
下班休息状态
public class RestState extends State{
@Override
public void WriteProgram(Work w){
System.out.println("当前时间: " + w.getHour() + " 下班回家了");
}
}
睡眠状态
public class SleepingState extends State{
@Override
public void WriteProgram(Work w){
System.out.println("当前时间: " + w.getHour() + " 不行了 睡着了");
}
}
客户端
static void main(String[] args){
Work work = new Work();
work.setHour(9);
work.WriteProgram();
work.setHour(10);
work.WriteProgram();
work.setHour(12);
work.WriteProgram();
work.setHour(13);
work.WriteProgram();
work.setHour(14);
work.WriteProgram();
work.setHour(17);
work.WriteProgram();
//work.setFinish(true);
work.setFinish(false);
work.WriteProgram();
work.setHour(19);
work.WriteProgram();
work.setHour(17);
work.WriteProgram();
}