状态模式
来源:互联网 发布:网络人头像 编辑:程序博客网 时间:2024/06/02 17:56
状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
解决的问题:主要解决的是当控制一个对象的转换表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一些列类中,可以把复杂的逻辑判断简单化。
模式的角色:
- 上下文环境(Context)
- 抽象状态(State)
- 具体状态(Concrete State)
Work.java
public class Work { //当前状态 private State current; //初始状态为上午工作状态 public Work(){ current=new ForenoonState(); } //当前时间 private double hour; public double getHour() { return hour; } public void setHour(double hour) { this.hour = hour; } //当前状态任务是否完成 private boolean finish=false; public boolean isFinish() { return finish; } public void setFinish(boolean finish) { this.finish = finish; } //判断当前状态任务是否完成 public boolean taskFinished(){ return finish; } //将State的实现类传入,执行不同状态下的writeProgram()方法 public void setState(State s){ this.current=s; } public void writeProgram(){ current.WriteProgram(this); }}
State.java-状态类
public abstract class State { public abstract void WriteProgram(Work w);}class ForenoonState extends State{ @Override public void WriteProgram(Work w) { if(w.getHour()<12){ System.out.println("当前时间,"+w.getHour()+"点,上午工作,精神百倍!"); }else{ w.setState(new NoonState()); w.writeProgram(); } }}class NoonState extends State{ @Override public void WriteProgram(Work w) { if(w.getHour()<13){ System.out.println("当前时间,"+w.getHour()+"点,饿了,犯困,午休!"); }else{ w.setState(new AfternoonState()); w.writeProgram(); } }}class AfternoonState extends State{ @Override public void WriteProgram(Work w) { if(w.getHour()<17){ System.out.println("当前时间,"+w.getHour()+"点,下午状态还不错,继续努力工作!"); }else{ w.setState(new EveningState()); w.writeProgram(); } }}class EveningState extends State{ @Override public void WriteProgram(Work w) { if(w.taskFinished()){ w.setState(new RestState()); w.writeProgram(); }else{ if(w.getHour()<21){ System.out.println("当前时间,"+w.getHour()+"点,加班疲劳至极..."); }else{ w.setState(new SleepingState()); w.writeProgram(); } } }}class RestState extends State{ @Override public void WriteProgram(Work w) { System.out.println("当前时间:"+w.getHour()+"点,下班回家休息了"); }}class SleepingState extends State{ @Override public void WriteProgram(Work w) { System.out.println("当前时间:"+w.getHour()+"点,眼睛睁不开,睡着了"); }}
Test.java
public class Test { public 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.setFinish(true); work.setFinish(false); work.writeProgram(); work.setHour(19); work.writeProgram(); work.setHour(22); work.writeProgram(); }}
输出
0 0
- 状态模式(状态变化)
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 语音识别 Embedded Training
- dp
- 内核模块参数
- Vmvare 宿主机与虚拟系统断网组建局域网
- Xcode代码中类和方法等字体变黑文件失去关联symbol not found
- 状态模式
- 集合转为字符串
- StrStrI函数
- IDEA 怎么设置多个 resources 目录?
- 大笨钟
- 多媒体(视频播放器)Mediaplayer+SurfaceView+Seekbar
- url-pattern
- MySQL(慕课网笔记)
- POJ 3467 Cross Counting 可能会