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

       状态模式(State Pattern)是对象行为模式的一种;它的意图是:允许一个对象在其内部状态改变的时改变它的行为。

        主要角色有:

          context(环境),State(抽象的状态角色),ConcreteState(真实的状态角色)

     状态模式使用的场景:

    1.   一个对象的行为依赖于它所处于的状态,对象的行为必须随着其状态的改变而改变
    2. 对象在某个方法中依赖于一重或多重的条件转移语句,其中有大量的代码。状态模式把条件转移语句你的每一个分支都包装到一个独立的类中。使得这些条件转移语句能够以类的形式独立的存在和演进。

    交通灯的状态有:红灯,黄灯和绿灯。
    交通灯的状态是会改变的,所以抽象的状态有一个操作就是改变状态

    /**
     * 状态机的接口
     * @author zhangwei_david
     * @version $Id: RedState.java, v 0.1 2015年1月12日 下午8:34:04 zhangwei_david Exp $
     */
    public interface State {
    
        /**
         * 装填的装换
         *
         * @return
         */
        public State change();
    }
    
    /**
     *交通灯的状态机
     * @author zhangwei_david
     * @version $Id: ColorState.java, v 0.1 2015年1月12日 下午8:35:55 zhangwei_david Exp $
     */
    public enum TrafficLightState implements State {
    
        RED {
            /**
             * @see com.cathy.demo.enumDemo.TrafficLightState#change()
             */
            @Override
            public State change() {
                // 红灯转换为绿灯
                return GREEN;
            }
        },
        GREEN {
            /**
             * @see com.cathy.demo.enumDemo.TrafficLightState#change()
             */
            @Override
            public State change() {
                // 绿灯转换为黄灯
                return YELLOW;
            }
        },
        YELLOW {
            /**
             * @see com.cathy.demo.enumDemo.TrafficLightState#change()
             */
            @Override
            public State change() {
                // 黄灯转换为红灯
                return RED;
            }
        };
    
        /**
         * @see com.cathy.demo.enumDemo.State#change()
         */
        public abstract State change();
    
    }
    
    /**
     *
     * @author zhangwei_david
     * @version $Id: Client.java, v 0.1 2015年1月12日 下午8:48:51 zhangwei_david Exp $
     */
    public class Client {
    
        /**
         *
         * @param args
         */
        public static void main(String[] args) {
            State state = TrafficLightState.GREEN;
            state = state.change();
            System.out.println(state);
            state = state.change();
            System.out.println(state);
            state = state.change();
            System.out.println(state);
            state = state.change();
            System.out.println(state);
            state = state.change();
            System.out.println(state);
        }
    
    }
    结果是:
    YELLOW
    RED
    GREEN
    YELLOW
    RED
    
  • 相关阅读:
    [POJ2104]K-th Number(区间第k值 记录初始状态)
    [POJ2007]Scrambled Polygon(计算几何 极角排序)
    [POJ1269]Intersecting Lines (计算几何)
    [POJ2318]TOYS (计算几何 行列式(叉乘)+二分)
    [HDOJ1394]Minimum Inversion Number(线段树,逆序数)
    Codeforces Round #319 (Div. 2) C. Vasya and Petya's Game 数学题
    BZOJ 1934 [Shoi2007]Vote 善意的投票 最小割
    BZOJ 1055 区间DP
    HDU4267 树状数组 不连续区间修改(三维)
    HDU 3308 线段树单点更新+区间查找最长连续子序列
  • 原文地址:https://www.cnblogs.com/wei-zw/p/8797787.html
Copyright © 2011-2022 走看看