State状态设计模式

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

一个用来改变类的(状态的)对象。设计模式

2:问题:当你本身实现 State 模式的时候就会碰到不少细节的问题,你必须根据本身的须要选择合适的实现方法,ide

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

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

三、代理(Proxy)设计模式其实是状态设计模式的一个特例代理

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

状态模式和策略模式的结构师彻底同样的,但它们的目的、实现、本质却彻底不同。orm

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

策略模式的行为是平等性的,是能够相互替换的blog

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

六、示例:

通用状态规范

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()

相关文章
相关标签/搜索