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();
        }
    }

    结果:

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

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

  • 相关阅读:
    -bash java: cannot execute binary file (华为鲲鹏云)
    Centos7.6编译安装数据库mysql5.7.22(华为鲲鹏云服务器案例)
    华为鲲鹏云服务器编译安装mysql-5.7.27 报错error: could not split insn
    centos7.6安装nginx并设置开机自启
    ansible常用模块实例
    Nginx、tomcat日志切割
    Linux系统文件系统损坏修复实例
    Rest模式get,put,post,delete含义与区别(转)
    从关系型数据库到非关系型数据库
    SQL Server 2012 Express LocalDB 的作用
  • 原文地址:https://www.cnblogs.com/qinggege/p/5243027.html
Copyright © 2011-2022 走看看