zoukankan      html  css  js  c++  java
  • Java枚举实现有限状态机

    首先在枚举类中 定义state 和定义的抽象方法。

    public enum JavaPlatformState {
        //  定义state
        OPEN{
            @Override void exit(JavaPlatformMachine pm){super.exit(pm);}
            
            @Override void valid(JavaPlatformMachine pm){
                this.exit(pm);
                if(pm.data.getValid_()){
                    pm.state =STEP1;
                }else{
                    NotFound();
                    pm.state =OFF;
                }
                pm.state.entry(pm);
            }
    
            @Override
            void first(JavaPlatformMachine pm) {}
    
            @Override
            void businessLine(JavaPlatformMachine pm) {}
    
            @Override
            void district(JavaPlatformMachine pm) {}
        },
        STEP1{
            @Override void exit(JavaPlatformMachine pm){super.exit(pm);}
    
            @Override
            void valid(JavaPlatformMachine pm) {}
    
            @Override void first(JavaPlatformMachine pm){
                this.exit(pm);
                if(!pm.data.getFirst_()){
                    pm.state =STEP2;
                }else{
                    ReturnDimension();
                    pm.state =OFF;
                }
                pm.state.entry(pm);
            }
    
            @Override
            void businessLine(JavaPlatformMachine pm) {}
    
            @Override
            void district(JavaPlatformMachine pm) {}
        },
        ...
       
        //状态模式 提取的接口  在常量实体类中实现抽象方法
        abstract void valid(JavaPlatformMachine pm);
        abstract void first(JavaPlatformMachine pm);
        abstract void businessLine(JavaPlatformMachine pm);
        abstract void district(JavaPlatformMachine pm); 
    }

    在enum JavaPlatformState 中,除了状态模式 提取的接口外,添加了状态机的各种动作action实现

    //状态机的各种动作action methode
        void entry(JavaPlatformMachine pm){System.out.println("→"+pm.state.name());}
        void exit(JavaPlatformMachine pm){System.out.println(pm.state.name()+"→ ");}
        
        void NotFound(){System.out.println("NotFound");}
        void ReturnDimension(){System.out.println("ReturnDimension");}
        void PreciseAdvertising(){System.out.println("PreciseAdvertising");}
        void Top9(){System.out.println("Top9");}

    建立状态机实体,ContextData是封装条件的bean类,初始化状态OPEN,在状态机里定义action,调用对应state的相应的方法。

    public class ContextData {
        private Boolean isValid_;//广告位是否有效
        private Boolean isFirst_;//是否第一次请求
        private Boolean isBusinessLine_;//是否属于业务线广告位
        private Boolean district_;//是否有地域
        ...
    }
    public class JavaPlatformMachine {
        ContextData data = new ContextData();
        JavaPlatformState state = JavaPlatformState.OPEN;
        //Action
        public void valid(){state.valid(this);}
        public void first(){state.first(this);}
        public void businessLine(){state.businessLine(this);}
        public void district(){state.district(this);}
    }

    测试方法,初始化状态机,设置参数,按次序调用对应的Action

     JavaPlatformMachine pm = new JavaPlatformMachine();
        pm.data.setValid_(true);// 广告位是否有效
        pm.data.setFirst_(false);// 是否第一次请求
        pm.data.setBusinessLine_(true);//是否属于业务线广告位
        pm.data.setDistrict_(true);//是否有地域
        pm.valid();
        pm.first();
        pm.businessLine();
        pm.district();

    输出结果:

    OPEN→ 
    →STEP1
    STEP1→ 
    →STEP2
    STEP2→ 
    →STEP3
    STEP3→ 
    Top9
    →OFF
  • 相关阅读:
    IntelliJ破解
    IDEA的配置
    已解决No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
    逆向工程,调试Hello World !程序(更新中)
    一种离谱到极致的页面侧边栏效果探究
    前端H5如何实现分享截图
    我女儿说要看雪,但是我家在南方,于是我默默的拿起了键盘,下雪咯。
    Web基本教程~05.CSS属性
    送你一朵小红花,CSS实现一朵旋转的小红花
    Vue 项目性能优化 —实战—面试
  • 原文地址:https://www.cnblogs.com/barrywxx/p/12861162.html
Copyright © 2011-2022 走看看