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

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

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

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

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

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

4、和策略模式Strategy的区别和联系(本段转载自:http://joe5456536.blog.163.com/blog/static/85374773201192252829941/)

状态模式和策略模式的结构师完全一样的,但它们的目的、实现、本质却完全不一样。

状态模式的行为是平行的,不可相互替换的

策略模式的行为是平等性的,是可以相互替换的

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

6、示例:

通用状态规范

1 package com.xinye.test.state;
2 /**
3  * 所有的状态都具有的行为规范
4  * @author xinye
5  *
6  */
7 public interface IState {
8     public void operator();
9 }

第一种状态

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

第二种状态

package com.xinye.test.state;

/**
 * 第二种状态
 * @author xinye
 *
 */
public class SecondState implements IState {

    @Override
    public void operator() {
        System.out.println(getClass().getSimpleName() + " operator()");
    }

}

第三种状态

 1 package com.xinye.test.state;
 2 
 3 /**
 4  * 第三种状态
 5  * @author xinye
 6  *
 7  */
 8 public class ThirdState implements IState {
 9 
10     @Override
11     public void operator() {
12         System.out.println(getClass().getSimpleName() + " operator()");
13     }
14 
15 }

状态模式Context(执行具体的方法的时候,需要传递相应的状态代码,个人感觉最好能定义出来一个Enum来规范)

 1 package com.xinye.test.state;
 2 /**
 3  * 状态上下文
 4  * @author xinye
 5  *
 6  */
 7 public class Context {
 8     
 9     private IState state = null;
10     /**
11      * 执行操作
12      * @param _state 哪一种状态
13      */
14     public void exec(int _state){
15         if(1 == _state){
16             state = new FirstState();
17         }else if(2 == _state){
18             state = new SecondState();            
19         }else{            
20             state = new ThirdState();            
21         }
22         state.operator();
23     }
24 }

客户端代码

 1 package com.xinye.test.state;
 2 /**
 3  * 客户端代码
 4  * @author xinye
 5  *
 6  */
 7 public class Client {
 8     public static void main(String[] args) {
 9         Context context = new Context();
10         
11         context.exec(1);
12         context.exec(2);
13         context.exec(3);
14     }
15 }

执行结果:
FirstState operator()
SecondState operator()
ThirdState operator()

 

-------------------------------------------------------------------------------------------

另一种Context和Client

 1 package com.xinye.test.state;
 2 /**
 3  * 第二种状态模式的实现
 4  * @author xinye
 5  *
 6  */
 7 public class Context_2 {
 8     private IState state = new FirstState();
 9     
10     public void exec(){
11         state.operator();
12         // 其他代码
13         // ***
14         changeState();
15         
16     }
17     private void changeState(){
18         if(state instanceof FirstState){
19             state = new SecondState();
20         }else if(state instanceof SecondState){
21             state = new ThirdState();
22         }else{
23             state = new FirstState();
24         }
25     }
26 }
27 
28 package com.xinye.test.state;
29 
30 public class Client_2 {
31     public static void main(String[] args) {
32         Context_2 context2 = new Context_2();
33         context2.exec();
34         context2.exec();
35         context2.exec();
36         context2.exec();
37         context2.exec();
38     }
39 }

执行结果:

FirstState operator()
SecondState operator()
ThirdState operator()
FirstState operator()
SecondState operator()

 

posted on 2014-08-12 23:48  wangwangheng  阅读(940)  评论(1编辑  收藏  举报