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

  • 相关阅读:
    poj 3693 Maximum repetition substring 重复次数最多的连续子串
    hdu 3518 Boring counting 后缀数组 height分组
    Codeforces 920G List Of Integers 二分 + 容斥
    Codeforces 920E Connected Components? 补图连通块个数
    Codeforces 920D Tanks
    LeetCode Weekly Contest 70 A B C D
    Educational Codeforces Round 37 A B C D E F
    检查站点SSL证书配置是否正确
    nginx rewrite之后post参数丢失问题
    Linux中如何避免buffers/cached占用过多内存
  • 原文地址:https://www.cnblogs.com/a294098789/p/5615425.html
Copyright © 2011-2022 走看看