• 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

  • 相关阅读:
    【项目】项目225
    【原创】如何带格式转载博客园文章或其他网站的文章
    【项目】项目226
    【项目】项目229
    【项目】项目223
    【项目】项目230
    【项目】项目227
    如何带格式转载博客园文章或其他网站的文章
    Thread.Sleep(0)真的是bug吗?
    14.redis的慢日志
  • 原文地址:https://www.cnblogs.com/jiangbei/p/7771764.html
Copyright © 2020-2023  润新知