状态模式、;当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
1、State抽象类
<span style="font-size:18px;">public abstract class State
{
public abstract void writeProgram(Work work);
}</span>
2、Work类<span style="font-size:18px;">public class Work
{
private State current;
public Work()
{
current = new ForenoonState();
}
private double hour;
public void setHour(double hour)
{
this.hour = hour;
}
public double getHour()
{
return hour;
}
private Boolean finish = false;
public boolean getTaskFinished()
{
return finish;
}
public void setTaskFinished(Boolean finish)
{
this.finish = finish;
}
public void setState(State s)
{
this.current=s;
}
public void writeProgram()
{
// TODO Auto-generated method stub
current.writeProgram(this);
}
}
</span>
3、ForenoonState类
<span style="font-size:18px;">public class ForenoonState extends State
{
@Override
public void writeProgram(Work work)
{
// TODO Auto-generated method stub
if(work.getHour()<12)
{
System.out.println("当前时间"+work.getHour()+"上午工作,精神百倍");
}
else
{
work.setState(new NoonState());
work.writeProgram();
}
}
}
</span>
4、NoonState类
<span style="font-size:18px;">public class NoonState extends State
{
@Override
public void writeProgram(Work work)
{
// TODO Auto-generated method stub
if(work.getHour()<13)
{
System.out.println("当前时间:"+work.getHour()+"饿了,午饭;犯困,午休");
}
else
{
work.setState(new AfternoonState());
work.writeProgram();
}
}
}
</span>
5、AfternoonState类
<span style="font-size:18px;">public class AfternoonState extends State
{
@Override
public void writeProgram(Work work)
{
// TODO Auto-generated method stub
if(work.getHour()<17)
{
System.out.println("当前时间"+work.getHour()+"下午状态还不错,继续努力");
}
else
{
work.setState(new EveningState());
work.writeProgram();
}
}
}</span>
6、EveningState类
<span style="font-size:18px;">public class EveningState extends State
{
@Override
public void writeProgram(Work work)
{
// TODO Auto-generated method stub
if(work.getTaskFinished())
{
work.setState(new RestState());
work.writeProgram();
}
else
{
if(work.getHour()<21)
{
System.out.println("当前时间"+work.getHour()+"加班哦,疲惫之极");
}
else
{
work.setState(new SleepingState());
work.writeProgram();
}
}
}
}
</span>
7、RestState类
<span style="font-size:18px;">public class RestState extends State
{
@Override
public void writeProgram(Work work)
{
// TODO Auto-generated method stub
System.out.println("当前时间"+work.getHour()+"下班回家了");
}
}
</span>
8、SleepingState类<span style="font-size:18px;">public class SleepingState extends State
{
@Override
public void writeProgram(Work work)
{
// TODO Auto-generated method stub
System.out.println("当前时间"+work.getHour()+"不行了,睡着了");
}
}</span>
9、Client类
<span style="font-size:18px;">public class Client
{
public static void main(String[] args)
{
Work emergencyProjects=new Work();
emergencyProjects.setHour(9);
emergencyProjects.writeProgram();
emergencyProjects.setHour(10);
emergencyProjects.writeProgram();
emergencyProjects.setHour(12);
emergencyProjects.writeProgram();
emergencyProjects.setHour(13);
emergencyProjects.writeProgram();
emergencyProjects.setHour(14);
emergencyProjects.writeProgram();
emergencyProjects.setHour(17);
emergencyProjects.writeProgram();
emergencyProjects.setTaskFinished(false);
emergencyProjects.setHour(19);
emergencyProjects.writeProgram();
emergencyProjects.setHour(22);
emergencyProjects.writeProgram();
}
}
</span>
运行结果
状态模式的好处:
1)将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
2)状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。
状态模式的使用场景:
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。
参考资料:程杰老师<大话程序设计>