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

原文地址:https://www.cnblogs.com/jiangbei/p/7771764.html