状态模式(State)

定义

  当一个对象的内在状态改变时允许改变其行为,这个帝乡看起来像是改变了其类。

UML类图

  

例子

  State

package com.csdhsm.pattemdesign.state;

/**  
 * @Title:  State.java   
 * @Description: 状态接口
 * @author: Han   
 * @date:   2016年6月24日 下午9:47:24  
 */  
public interface State {
    
    public void handler(StateMachine state);
}

  Context

package com.csdhsm.pattemdesign.state;

/**  
 * @Title:  StateMachine.java   
 * @Description: 环境(Context)角色:给出此时的状态 
 * @author: Han   
 * @date:   2016年6月24日 下午9:49:35  
 */  
public class StateMachine {
    
    //当前的状态
    private State currentState;

    public State getCurrentState() {
        return currentState;
    }

    public void setCurrentState(State currentState) {
        this.currentState = currentState;
    }
}

  开始状态

package com.csdhsm.pattemdesign.state;

/**  
 * @Title:  StartState.java   
 * @Description: 开始状态
 * @author: Han   
 * @date:   2016年6月24日 下午9:47:39  
 */  
public class StartState implements State {

    @Override
    public void handler(StateMachine state) {
        
        System.out.println("start to process...");
        //进入制作状态
        state.setCurrentState(new MakeState());
    }
}

  制作状态

package com.csdhsm.pattemdesign.state;

/**  
 * @Title:  MakeState.java   
 * @Description: 制作状态
 * @author: Han   
 * @date:   2016年6月24日 下午9:48:56  
 */  
public class MakeState implements State {

    @Override
    public void handler(StateMachine state) {
        
        System.out.println("Makeing...");
        //进入完成状态
        state.setCurrentState(new CompletedState());
    }
}

  完成状态

package com.csdhsm.pattemdesign.state;

/**  
 * @Title:  CompletedState.java   
 * @Description: 完成状态
 * @author: Han   
 * @date:   2016年6月24日 下午9:49:06  
 */  
public class CompletedState implements State {

    @Override
    public void handler(StateMachine state) {
        
        System.out.println("complete...");
        state.setCurrentState(null);
    }
}

  客户端

package com.csdhsm.pattemdesign.state;

public class Solution {
    
    public static void main(String[] args) {
        
        StateMachine machine = new StateMachine();
        State start = new StartState();
        machine.setCurrentState(start);
        
        //一直更改状态,直到完成
        while(machine.getCurrentState() != null) {
            machine.getCurrentState().handler(machine);
        }
    }
}

  结果

  ok,成功!

总结

  在状态模式中,环境(Context)是持有状态的对象,但是环境(Context)自身并不处理跟状态相关的行为,而是把处理状态的功能委托给了状态对应的状态处理类来处理。

  在具体的状态处理类中经常需要获取环境(Context)自身的数据,甚至在必要的时候会回调环境(Context)的方法,因此,通常将环境(Context)自身当作一个参数传递给具体的状态处理类。

  客户端一般只和环境(Context)交互。客户端可以用状态对象来配置一个环境(Context),一旦配置完毕,就不再需要和状态对象打交道了。客户端通常不负责运行期间状态的维护,也不负责决定后续到底使用哪一个具体的状态处理对象。

  引用资料:http://www.cnblogs.com/BenWong/archive/2012/12/12/2813982.html    http://www.cnblogs.com/java-my-life/archive/2012/06/08/2538146.html

 posted on 2016-06-24 21:56  韩思明  阅读(196)  评论(0编辑  收藏  举报