zoukankan      html  css  js  c++  java
  • 设计模式(16)-----状态模式

    状态模式(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

  • 相关阅读:
    POI处理Excel工具类
    Mac打开隐藏文件夹
    markdown语法
    U盘分区合并
    数组
    Java插入到mysql数据库显示问号?
    使用vmware打开别人提供好的vmx没反应怎么办?
    求长方形的外接圆
    读取mysql数据库
    excel对列的常用操作
  • 原文地址:https://www.cnblogs.com/a294098789/p/5615425.html
Copyright © 2011-2022 走看看