zoukankan      html  css  js  c++  java
  • (十七)状态模式-代码实现

    介绍

    首先明白两个单词:打开和关闭是同一个物体的两种状态,是需要经常互相切换的,不是没有关系的两个单词. let`s Go

    概念:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

    应用场景:关闭着的门--》打开的门--》关闭的门,自动的切换到下一个状态的可执行事件。

    好处:控制对象内部不同的状态执行不同的操作,按照状态流程执行。

    典型的状态模式例子

    代码:

    //状态接口

    package note.com.state;
    
    /**
     * 状态接口定义
     * @author lxz
     *
     */
    public interface State {
        public State changeState();
        public void doOne();
        public void doTwo();
        public void doThree();
    }

    //具体状态

    package note.com.state;
    
    public class Open implements State{
    
        
        public State changeState() {
            return new Connect();
        }
    
        public void doOne() {
            System.out.println("事件一:打开状态执行");
            
        }
    
        public void doTwo() {
            System.out.println("事件二:打开状态执行");
            
        }
    
        public void doThree() {
            System.out.println("事件三:打开状态执行");
        }
    
        
    }
    package note.com.state;
    
    public class Connect implements State{
    
        
        public State changeState() {
            return new Close();
        }
    
        public void doOne() {
            System.out.println("事件一:连接状态执行");
            
        }
    
        public void doTwo() {
            System.out.println("事件二:连接状态执行");
            
        }
    
        public void doThree() {
            System.out.println("事件三:连接状态执行");
        }
    
        
    }
    package note.com.state;
    
    public class Close implements State{
    
        
        public State changeState() {
            return new Open();
        }
    
        public void doOne() {
            System.out.println("事件一:关闭状态执行");
            
        }
    
        public void doTwo() {
            System.out.println("事件二:关闭状态执行");
            
        }
    
        public void doThree() {
            System.out.println("事件三:关闭状态执行");
        }
    
        
    }

    //根据状态来执行具体操作的类

    package note.com.state;
    
    public class Context {
        private State state = null;
    
        public Context(){
            state = new Open();
        }
        public State getState() {
            return state;
        }
    
        public void setState(State state) {
            this.state = state;
        }
        
        public void execute(){
            state.doOne();
            state.doTwo();
            state.doThree();
            state = state.changeState();
        }
        
    }

    //测试类

    package note.com.state;
    
    public class StateTest {
        public static void main(String[] args) {
            Context context = new Context();
            context.execute();
            context.execute();
            context.execute();
            context.execute();
        }
    }

    结果:

    事件一:打开状态执行
    事件二:打开状态执行
    事件三:打开状态执行
    事件一:连接状态执行
    事件二:连接状态执行
    事件三:连接状态执行
    事件一:关闭状态执行
    事件二:关闭状态执行
    事件三:关闭状态执行
    事件一:打开状态执行
    事件二:打开状态执行
    事件三:打开状态执行

    这个例子非常切合概念,有明显的状态内部的切换,有状态改变后的不同事件

  • 相关阅读:
    关于属性值
    REG小探
    纯CSS实现立方体旋转
    css3总结(三)立方体、动画、web字体、字体图标、弹性布局、多列布局、伸缩盒子
    css3总结(二)背景色渐变、background、边框图片、过渡、2d变换、3d变换
    css3总结(一)属性选择器、伪类、伪元素、盒模型、边框圆角、文本阴影、边框阴影
    自定义视频播放器(功能包括:播放/暂停,全屏,跳播)
    html5总结
    Git workflow- Git 工作流
    nodejs使用redis实现sub/pub
  • 原文地址:https://www.cnblogs.com/qinggege/p/5243027.html
Copyright © 2011-2022 走看看