状态模式(State):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况。把状态的判断逻辑转移表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
状态模式好处:将特定的状态相关的行为局部化,并且将不同状态的行为分割开来。
将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所有通过定义新的子类可以容易得增加新的状态和转换。
状态模式通过各种状态转移逻辑分布到 State 的子类之间,来减少相互的依赖。
当一个对象的行为取决于它的状态的时候,并且它必须在运行时刻状态改变它的行为时,就可以考虑使用状态模式了。
1 //工作类,整个工作流程中只有它一个,根据它的状态改变执行相应的行为。 2 public class Work { 3 4 private double hour; 5 6 private State current; 7 8 private boolean finish = false; 9 10 public double getHour() { 11 return hour; 12 } 13 14 public void setHour(double hour) { 15 this.hour = hour; 16 } 17 18 public State getCurrent() { 19 return current; 20 } 21 22 public void setCurrent(State current) { 23 this.current = current; 24 } 25 26 public boolean isFinish() { 27 return finish; 28 } 29 30 public void setFinish(boolean finish) { 31 this.finish = finish; 32 } 33 34 public Work(){ 35 this.current = new ForenoonState(); 36 } 37 38 public void coding(){ 39 current.coding(this); 40 } 41 42 }
1 public abstract class State { 2 3 public abstract void coding(Work work); 4 5 } 6 7 8 //上午状态类 9 class ForenoonState extends State{ 10 11 @Override 12 public void coding(Work work) { 13 if(work.getHour() < 12){ 14 System.out.println("当前时间 : " + work.getHour() + " 精神百倍!"); 15 }else{ 16 work.setCurrent(new NoonState()); 17 work.coding(); 18 } 19 } 20 21 } 22 23 24 //中午状态类 25 class NoonState extends State{ 26 27 @Override 28 public void coding(Work work) { 29 if(work.getHour() < 13){ 30 System.out.println("当前时间 : " + work.getHour() + " 午饭、睡觉!"); 31 }else{ 32 work.setCurrent(new AFternoonState()); 33 work.coding(); 34 } 35 } 36 37 } 38 39 class AFternoonState extends State{ 40 41 @Override 42 public void coding(Work work) { 43 if(work.getHour() < 18){ 44 System.out.println("当前时间 : " + work.getHour() + " 下午班努力工作中!"); 45 }else{ 46 work.setCurrent(new EveningState()); 47 work.coding(); 48 } 49 } 50 51 } 52 53 class EveningState extends State{ 54 55 @Override 56 public void coding(Work work) { 57 if(work.isFinish()){ 58 work.setCurrent(new RestState()); 59 }else{ 60 if(work.getHour() < 21){ 61 System.out.println("当前时间 : " + work.getHour() + " 加班哦,好累!"); 62 }else{ 63 work.setCurrent(new SleepingState()); 64 work.coding(); 65 } 66 } 67 } 68 69 } 70 71 class SleepingState extends State{ 72 73 @Override 74 public void coding(Work work) { 75 System.out.println("当前时间 : " + work.getHour() + " 啥都不理了,睡觉!"); 76 } 77 78 } 79 80 class RestState extends State{ 81 82 @Override 83 public void coding(Work work) { 84 System.out.println("当前时间 : " + work.getHour() + " 回家咯!"); 85 } 86 87 }
1 public static void main(String[] args) { 2 Work w = new Work(); 3 4 w.setHour(9); 5 w.coding(); 6 w.setHour(10); 7 w.coding(); 8 w.setHour(11); 9 w.coding(); 10 w.setHour(12); 11 w.coding(); 12 w.setHour(13); 13 w.coding(); 14 w.setHour(15); 15 w.coding(); 16 w.setHour(17); 17 w.coding(); 18 w.setHour(19); 19 w.coding(); 20 w.setHour(20); 21 w.coding(); 22 w.setHour(21); 23 w.coding(); 24 w.setHour(22); 25 w.coding(); 26 27 }
打印结果:
当前时间 : 9.0 精神百倍!
当前时间 : 10.0 精神百倍!
当前时间 : 11.0 精神百倍!
当前时间 : 12.0 午饭、睡觉!
当前时间 : 13.0 下午班努力工作中!
当前时间 : 15.0 下午班努力工作中!
当前时间 : 17.0 下午班努力工作中!
当前时间 : 19.0 加班哦,好累!
当前时间 : 20.0 加班哦,好累!
当前时间 : 21.0 啥都不理了,睡觉!
当前时间 : 22.0 啥都不理了,睡觉!