zoukankan      html  css  js  c++  java
  • State状态设计模式

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

  • 相关阅读:
    CocosIDE导出Android APK的注意事项
    C++14尝鲜:Generic Lambdas(泛型lambda)
    silverlight调用WebService传递json接收绑定数据
    解决考试系统高并发数据载入不对问题
    汇编入门学习笔记 (九)—— call和ret
    Java SerialPort SDK
    how tomcat works 总结 二
    linux下多线程的调试
    垃圾回收GC:.Net自己主动内存管理 上(二)内存算法
    HDU-4973-A simple simulation problem.(线段树)
  • 原文地址:https://www.cnblogs.com/xinye/p/3908989.html
Copyright © 2011-2022 走看看