zoukankan      html  css  js  c++  java
  • Java设计模式(22)——行为模式之状态模式(State)

    一、概述

      概念

       

      再引用网友的说通俗一点:

      State模式在实际使用中比较多,适合"状态的切换"。因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了。

    不只是根据状态,也有根据属性。如果某个对象的属性不同,对象的行为就不一样,这点在数据库系统中出现频率比较高,我们经常会在一个数据表的尾部,加上property属性含义的字段,用以标识记录中一些特殊性质的记录,这种属性的改变(切换)又是随时可能发生的,就有可能要使用State。

      一些类似旋转开关(从1切换到2,再切换3...)的时候,应该想到状态模式了!

       UML简图

      

       角色

      抽象状态角色:定义接口,封装环境对象特定状态对应的行为

      具体状态角色:实现环境状态对应的行为

      环境角色:定义客户端感兴趣的接口,保留具体状态类的实例

    二、实践

      把上面的UML简图给出示意性代码

      抽象状态

    /**
     * 抽象状态接口
     *
     * @author Administrator
     **/
    public interface State {
        void operation();
    }

      具体状态(实际会有多个,这里给出一个示意性的)

    /**
     * 具体状态角色
     *
     * @author Administrator
     **/
    public class ConcreteState implements State{
        @Override
        public void operation() {
            // 具体逻辑
        }
    }

      环境角色

    /**
     * 环境角色
     *
     * @author Administrator
     **/
    public class Context {
        private State state;
    
        public void setState(State state) {
            this.state = state;
        }
        public void operation() {
            state.operation();
        }
    }

      这里需要再次指出,模式对应的是状态的“旋转改变”——比如电梯开门,下一个状态应该是电梯关门,电梯关门,下一个状态应该是电梯上下行,

    在之前,我们可以通过if..else来强制实现,但会显得逻辑混乱,难以维护!

      一个完整的案例分析,请参见:http://blog.csdn.net/taozi8023/article/details/51456769

    三、改进与思考

       一个通过客户端切换状态的简单实例参见:http://ifeve.com/state-design-pattern-in-java-example-tutorial/

      由浅入深,强力推荐http://blog.csdn.net/u012401711/article/details/52675873

  • 相关阅读:
    c++ 学习笔记
    python 2048游戏控制器
    c++ 动态内存
    c++ 拷贝构造函数、拷贝运算符、析构函数
    c++ struct enum union加typedef与不加typedef
    c++ 动态内存2
    c++ 指针数组与指向数组的指针
    c++ TextQuery程序
    c++ virtual
    c++ 动态内存 动态数组
  • 原文地址:https://www.cnblogs.com/jiangbei/p/7771764.html
Copyright © 2011-2022 走看看