首页 > 代码库 > State状态设计模式

State状态设计模式

1、状态模式:改变对象的行为

一个用来改变类的(状态的)对象。

2:问题:当你自己实现 State 模式的时候就会碰到很多细节的问题,你必须根据自己的需要选择合适的实现方法,

比如用到的状态(State)是否要暴露给调用的客户,以及如何使状态发生变化

用于改变状态的机制可能很简单也可能很复杂-比如状态机(State Machine)

3、代理(Proxy)设计模式实际上是状态设计模式的一个特例

4、类图以及UML(astah/jude)下载地址 : http://pan.baidu.com/s/1o60VC1O

5、实现实例

状态公共接口

 1 package com.xinye.test.state; 2 /** 3  * 所有的状态的通用接口 4  * @author  5  * 6  */ 7 public interface IState { 8     void service(); 9     void call();10 }

第一种状态

 1 package com.xinye.test.state; 2 /** 3  * 第一种状态 4  * @author  5  * 6  */ 7 public class FirstState implements IState { 8  9     @Override10     public void service() {11         System.out.println(getClass().getSimpleName() + " service()");12 13     }14 15     @Override16     public void call() {17         System.out.println(getClass().getSimpleName() + " call()");18     }19 20 }

第二种状态

 1 package com.xinye.test.state; 2 /** 3  * 第二种状态 4  * @author  5  * 6  */ 7 public class SecondState implements IState { 8  9     @Override10     public void service() {11         System.out.println(getClass().getSimpleName() + " service()");12 13     }14     @Override15     public void call() {16         System.out.println(getClass().getSimpleName() + " call()");17     }18 19 }

第三种状态

 1 package com.xinye.test.state; 2 /** 3  * 低三种状态 4  * @author 5  * 6  */ 7 public class ThirdState implements IState { 8  9     @Override10     public void service() {11         System.out.println(getClass().getSimpleName() + " service()");12 13     }14     @Override15     public void call() {16         System.out.println(getClass().getSimpleName() + " call()");17     }18 19 }

状态设计模式的实现

 1 package com.xinye.test.state; 2 /** 3  * 状态设计模式的实现 4  * @author 5  * 6  */ 7 public class Creature { 8      9     private IState state ;10     11     public Creature(IState state){12         this.state = state;13     } 14     /**15      * 改变状态16      * @param state17      */18     public void changeState(IState state){19         this.state = state;20     }21     /**22      * 可以执行的动作123      */24     public void exec(){25         state.call();26         state.service();27     }28     /**29      * 可以执行的操作230      */31     public void say(){32         state.service();33         state.call();34     }35     36 }

客户端代码

 1 package com.xinye.test.state; 2 /** 3  * 客户端代码 4  * @author 5  * 6  */ 7 public class Client { 8     public static void main(String[] args) { 9         Creature c = new Creature(new FirstState());10         c.exec();11         c.say();12 13         System.out.println("---------------------------------");14         c.changeState(new SecondState());15         c.exec();16         c.say();17         18         System.out.println("---------------------------------");19         c.changeState(new ThirdState());20         c.exec();21         c.say();22     }23 }

 执行结果

FirstState call()
FirstState service()
FirstState service()
FirstState call()
---------------------------------
SecondState call()
SecondState service()
SecondState service()
SecondState call()
---------------------------------
ThirdState call()
ThirdState service()
ThirdState service()
ThirdState call()