Java代码
- package state.example;
- /**
- *
- *作者:alaric
- *时间:2013-9-7上午11:14:32
- *描述:抽象状态类
- */
- public interface State {
-
- public void change(Light light);
- }
Java代码
- package state.example;
-
-
- public class GreenState implements State {
- private static final Long SLEEP_TIME = 2000L;
- @Override
- public void change(Light light) {
-
- System.out.println("现在是绿灯,可以通行");
- //绿灯亮1秒
- try {
- Thread.sleep(SLEEP_TIME);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- light.setState(new YellowState());
- }
-
- }
Java代码
- package state.example;
-
-
- public class YellowState implements State {
- private static final Long SLEEP_TIME = 500L;
- @Override
- public void change(Light light) {
-
- System.out.println("现在是黄灯,警示");
- //红灯亮0.5秒
- try {
- Thread.sleep(SLEEP_TIME);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- light.setState(new RedState());
- }
-
- }
Java代码
- package state.example;
-
-
- public class RedState implements State {
- private static final Long SLEEP_TIME = 1000L;
- @Override
- public void change(Light light) {
-
- System.out.println("现在是红灯,禁止通行");
- //红灯亮1秒
- try {
- Thread.sleep(SLEEP_TIME);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- light.setState(new GreenState());
- }
-
- }
Java代码
- package state.example;
-
- public class Light {
-
- private State state;
-
- private void change(){
- state.change(this);
- }
-
- public void work(){
- while(true){
- change();
- }
- }
- public Light(State state) {
- super();
- this.state = state;
- }
-
- public State getState() {
- return state;
- }
-
- public void setState(State state) {
- this.state = state;
- }
-
- }
Java代码
- package state.example;
- /**
- *
- *作者:alaric
- *时间:2013-9-7上午11:27:41
- *描述:测试客户端
- */
- public class Client {
-
- /**
- *作者:alaric
- *时间:2013-9-7上午11:27:34
- *描述:
- */
- public static void main(String[] args) {
-
- //假设路灯开始是绿灯
- State state = new GreenState();
- Light light = new Light(state);
- light.work();
-
- }
-
- }
运行结果:
现在是绿灯,可以通行
现在是黄灯,警示
现在是红灯,禁止通行
现在是绿灯,可以通行
现在是黄灯,警示
现在是红灯,禁止通行
现在是绿灯,可以通行
现在是黄灯,警示
.....
通过上面例子可以看出,状态模式将与特定状态相关的行为局部化,并且将不同状态的行为分割开来;所有状态相关的代码都存在于某个ConcereteState中,所以通过定义新的子类很容易地增加新的状态和转换;状态模式通过把各种状态转移逻辑分不到State的子类之间,来减少相互间的依赖。缺点是:会导致有很多State 的子类。
状态模式和策略模式结构完全一样,很容易混淆,这里列举下状态模式和策略模式的区别:
1、状态模式有明显的状态过渡,从一个状态到另一个状态转换过程,在整个生命周期里有多个状态转换;而策略模式一旦环境角色选择了一个具体的策略类,那么在整个生命周期它始终不会改变;
2、状态模式多数是外在原因在环境角色中放入一个具体的状态类,而策略模式是自主选择一个具体的策略类;
3、状态模式选择一个状态是会明显告诉客户端的,而策略模式则不会告诉客户端选择了什么策略。
|