• (十七)状态模式-代码实现


    介绍

    首先明白两个单词:打开和关闭是同一个物体的两种状态,是需要经常互相切换的,不是没有关系的两个单词. 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();
        }
    }

    结果:

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

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

  • 相关阅读:
    项目管理基本目录结构
    Linux 杀死所有进程
    PHP生成唯一固定长度邀请码
    ubuntu LNMP环境下安装Redis,以及php的redis扩展
    Ubuntu linux 返回上一次访问的目录
    ubuntu删除ppa源
    ubuntu1.8安装lnmp失败
    phpstorm更改sql文件匹配类型
    小程序组件概述
    小程序中WXSS样式控制
  • 原文地址:https://www.cnblogs.com/qinggege/p/5243027.html
Copyright © 2020-2023  润新知