参考:http://blog.youkuaiyun.com/shendl/archive/2006/09/22/1267142.aspx
http://zhidao.baidu.com/question/93967748.html
状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
使用前提:状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
使用好处:将与特定状态相关的行为局部化,并且将不同状态的行为分割开来,就是将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个State的继承类中,所以通过定义新的子类可以很容易地增加新的状态与转换。这样做目的就是为了消除庞大的条件分支语句。大的分支判断会使得它们难以修改和拓展,状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。当一个对象的行为取决于它的状态,摈弃它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。
实例代码一:
interface State{ public void shot(); } //正常: public class NormalState implements State { public void shot() { System.out.println("今天你投篮十中五"); } } //不正常 public class NonormalState implements State { public void shot() { System.out.println("今天你投篮十中一"); } } //超常: public class SuperState implements State { public void shot() { System.out.println("今天你投篮十中十"); } } //这个时候我们来一个环境,一个运动员,正常情况下是正常状态 public class Player { private State state = new NormalState(); public void setState(State state) { this.state = state; } public void shot() { state.shot();// 这里我感觉是创建型模式的适配器模式,对象适配器。应该就是这样, } } //测试这个例子 public class StateTest { public static void main(String[] args) { Player player = new Player(); player.shot();// 正常下投篮 player.setState(new NonormalState()); player.shot();// 不正常下投篮 player.setState(new SuperState()); player.shot();// 超常下投篮 } }
实例代码二:
public abstract class State { public abstract void WriteProgram(Work w); } public class ForenoonState extends State{ public void WriteProgram(Work w) { if(w.getHour() < 11) { System.out.println("当前时间"+w.getHour()+" 上午工作,精神百倍 " ); }else { w.setState(new NoonState()); w.WriteProgram(); } } } //中午工作状态 public class NoonState extends State{ @Override public void WriteProgram(Work w) { if(w.getHour() < 14) { System.out.println("当前时间"+w.getHour()+" 中午工作,饿了,犯困,午休 " ); }else { w.setState(new AfternoonState()); w.WriteProgram(); } } } public class AfternoonState extends State { @Override public void WriteProgram(Work w) { if(w.getHour() < 17) { System.out.println("当前时间"+w.getHour()+" 下午状态还不错,继续努力" ); } } } //工作 public class Work { 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; } private State current; public Work() { current = new ForenoonState(); } private double hour; private boolean finish = false; public void setState(State s) { current = s; } public void WriteProgram() { current.WriteProgram(this); } } public class TestState { public static void main(String[] args) { Work work = new Work(); work.setHour(9); work.WriteProgram(); work.setHour(13); work.WriteProgram(); work.setHour(16); work.WriteProgram(); } }
本文详细介绍了状态模式的概念及其应用场景,通过两个实例代码展示了如何利用状态模式简化对象行为的控制逻辑,适用于对象状态变化复杂的场景。
198

被折叠的 条评论
为什么被折叠?



