您的位置:首页 > 其它

设计模式之状态模式

2016-04-09 21:14 260 查看
public class Work {
private State current;
private double hour;
private boolean finish = false;

public boolean isFinish() {
return finish;
}
public void setFinish(boolean finish) {
this.finish = finish;
}
public double getHour() {
return hour;
}
public void setHour(double hour) {
this.hour = hour;
}
public Work() {
current = new ForenoonState();
}
public void SetState(State s) {
current = s;
}
public void WriteProgram() {
current.WriteProgram(this);
}
}
public abstract class State {
public abstract void WriteProgram(Work w);
}
public class ForenoonState extends State {
public void WriteProgram(Work w) {
// TODO Auto-generated method stub
if(w.getHour() < 12) {
System.out.println("当前时间" + w.getHour() + "点,上午工作,精神百倍");
} else {
//大于12点,转入中午的状态
w.SetState(new NoonState());
w.WriteProgram();
}
}
}
public class NoonState extends State {
public void WriteProgram(Work w) {
// TODO Auto-generated method stub
if(w.getHour() < 13) {
System.out.println("当前时间" + w.getHour() + "点,午休");
} else {
//大于13点了,转入下午的工作状态
w.SetState(new AfternoonState());
w.WriteProgram();
}
}
}
public class AfternoonState extends State {

public void WriteProgram(Work w) {
// TODO Auto-generated method stub
if(w.getHour() < 17) {
System.out.println("当前时间" + w.getHour() + "点,下午状态不错,继续努力");
} else {
//大于17点了,转入晚上的加班状态
w.SetState(new EveningState());
w.WriteProgram();
}
}
}
public class ResetState extends State {
public void WriteProgram(Work w) {
// TODO Auto-generated method stub
System.out.println("当前时间:" + w.getHour() + "已完成工作可以下班回家了");
}
}
public class EveningState extends State {

public void WriteProgram(Work w) {
// TODO Auto-generated method stub
if(w.isFinish()) {
//任务完成,转入下班的状态
w.SetState(new ResetState());
w.WriteProgram();
} else {
if(w.getHour() < 21) {
System.out.println("当前时间" + w.getHour() + "点,加班状态,疲惫至极");
} else {
//已经超过21点,转入睡眠状态了
w.SetState(new SleepingState());
w.WriteProgram();
}
}
}
}
public class SleepingState extends State {
public void WriteProgram(Work w) {
// TODO Auto-generated method stub
System.out.println("当前时间:" + w.getHour() + "点,加班睡着了");
}
}
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Work w = new Work();
w.setHour(9);
w.WriteProgram();

w.setHour(10);
w.WriteProgram();

w.setHour(12);
w.WriteProgram();

w.setHour(13);
w.WriteProgram();

w.setHour(14);
w.WriteProgram();

w.setHour(17);
w.WriteProgram();

w.setFinish(false);
w.WriteProgram();

w.setHour(19);
w.WriteProgram();

w.setHour(22);
w.WriteProgram();
}
}


状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

好处:

将与特定状态相关的行为局部化,且将不同状态的行为分割开来,将特定状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易的增加新的状态和转换。

用处:

当一个对象的行为取决于他的状态,并且必须在运行时刻根据状态改变它的行为时应考虑使用状态模式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: