Loading... # 设计模式(十三)——状态模式 ## 参考 > 大话设计模式  ——  程杰 著 ## 目录 [设计模式(一)——简单工厂模式](https://www.princelei.club/archives/67.html) [设计模式(二)——策略模式](https://www.princelei.club/archives/68.html) [设计模式(三)——设计原则](https://www.princelei.club/archives/116.html) [设计模式(四)——装饰模式](https://www.princelei.club/archives/117.html) [设计模式(五)——代理模式](https://www.princelei.club/archives/119.html) [设计模式(六)——工厂方法模式](https://www.princelei.club/archives/132.html) [设计模式(七)——原型模式](https://www.princelei.club/archives/133.html) [设计模式(八)——模板方法模式](https://www.princelei.club/archives/134.html) [设计模式(九)——外观模式](https://www.princelei.club/archives/135.html) [设计模式(十)——建造者模式](https://www.princelei.club/archives/136.html) [设计模式(十一)——观察者模式](https://www.princelei.club/archives/137.html) [设计模式(十二)——抽象工厂模式](https://www.princelei.club/archives/138.html) [设计模式(十三)——状态模式](https://www.princelei.club/archives/139.html) [设计模式(十四)——适配器模式](https://www.princelei.club/archives/140.html) [设计模式(十五)——备忘录模式](https://www.princelei.club/archives/141.html) [设计模式(十六)——组合模式](https://www.princelei.club/archives/147.html) [设计模式(十七)——迭代器模式](https://www.princelei.club/archives/148.html) [设计模式(十八)——单例模式](https://www.princelei.club/archives/157.html) [设计模式(十九)——桥接模式](https://www.princelei.club/archives/159.html) [设计模式(二十)——命令模式](https://www.princelei.club/archives/160.html) [设计模式(二十一)——职责链模式](https://www.princelei.club/archives/161.html) [设计模式(二十二)——中介者模式](https://www.princelei.club/archives/162.html) [设计模式(二十三)——享元模式](https://www.princelei.club/archives/163.html) [设计模式(二十四)——解释器模式](https://www.princelei.club/archives/173.html) [设计模式(二十五)——访问者模式](https://www.princelei.club/archives/174.html) ## 何为状态模式 - 状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中。 ## 示例 输出一个码农一天从早到晚的工作状态: ``` /** * 抽象状态 */ public interface State { void writeProgram(Work w); } ``` ``` /** * 上午工作状态 */ public class ForenoonState implements State { @Override public void writeProgram(Work w) { if (w.getHour() < 12) { System.out.println("当前时间:" + w.getHour() + "点 上午工作,精神百倍"); } else { w.setState(new NoonState()); w.writePrgram(); } } } ``` ``` /** * 中午工作状态 */ public class NoonState implements State { @Override public void writeProgram(Work w) { if (w.getHour() < 13) { System.out.println("当前时间:" + w.getHour() + "点 饿了,午饭;犯困,午休。"); } else { w.setState(new AfternoonState()); w.writePrgram(); } } } ``` ``` /** * 下午和傍晚工作状态 */ public class AfternoonState implements State { @Override public void writeProgram(Work w) { if (w.getHour() < 17) { System.out.println("当前时间:" + w.getHour() + "点 下午状态还不错,继续努力"); } else { w.setState(new EveningState()); w.writePrgram(); } } } ``` ``` /** * 晚间工作状态 */ public class EveningState implements State { @Override public void writeProgram(Work w) { if (w.isFinish()) { w.setState(new RestState()); w.writePrgram(); } else { if (w.getHour() < 21) { System.out.println("当前时间:" + w.getHour() + "点 加班哦,疲累之极"); } else { w.setState(new SleepingState()); w.writePrgram(); } } } } ``` ``` /** * 睡眠状态 */ public class SleepingState implements State { @Override public void writeProgram(Work w) { System.out.println("当前时间:" + w.getHour() + "点不行了,睡着了。"); } } ``` ``` /** * 下班休息状态 */ public class RestState implements State { @Override public void writeProgram(Work w) { System.out.println("当前时间:" + w.getHour() + "点下班回家了"); } } ``` ``` /** * 工作 */ public class Work { private State current; private double hour; private boolean finish = false; public Work() { current = new ForenoonState(); } public double getHour() { return hour; } public void setHour(double hour) { this.hour = hour; } public boolean isFinish() { return finish; } public void setFinish(boolean finish) { this.finish = finish; } public void setState(State state) { this.current = state; } public void writePrgram() { current.writeProgram(this); } } ``` ``` /** * 客户端 */ public class MainClass { public static void main(String[] args) { Work emergencyProjects = new Work(); emergencyProjects.setHour(9); emergencyProjects.writePrgram(); emergencyProjects.setHour(10); emergencyProjects.writePrgram(); emergencyProjects.setHour(12); emergencyProjects.writePrgram(); emergencyProjects.setHour(13); emergencyProjects.writePrgram(); emergencyProjects.setHour(14); emergencyProjects.writePrgram(); emergencyProjects.setHour(17); // emergencyProjects.setFinish(true); emergencyProjects.setFinish(false); emergencyProjects.writePrgram(); emergencyProjects.setHour(19); emergencyProjects.writePrgram(); emergencyProjects.setHour(22); emergencyProjects.writePrgram(); } } ``` 输出: ``` 当前时间:9.0点 上午工作,精神百倍 当前时间:10.0点 上午工作,精神百倍 当前时间:12.0点 饿了,午饭;犯困,午休。 当前时间:13.0点 下午状态还不错,继续努力 当前时间:14.0点 下午状态还不错,继续努力 当前时间:17.0点 加班哦,疲累之极 当前时间:19.0点 加班哦,疲累之极 当前时间:22.0点不行了,睡着了。 ``` ## 状态模式的好处与用处 状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和转换。状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。 Last modification:June 11th, 2020 at 06:24 pm © 允许规范转载
多语种文献的引用彰显学术包容性。