zoukankan      html  css  js  c++  java
  • 用状态机模式消除复杂的 if else 逻辑

    前一阵开发的一个 web 界面上有很多诸如“按钮隐藏显示”,“边框隐藏显示”,“伸缩” 等效果的切换,在展示不同内容的时候,这些配套的显示控件需要跟着切换不同的状态。迫于进度,使用的是 if..else, 或者 switch..case 的繁杂的 js 代码来实现这些状态的判断和转换。js 代码很快到了 400~500行,变得很难理解。并且我要加入新的状态切换的时候感觉比较困难。今天决心重构,于是忽然联想起状态机 (State Machine) 模式,不正好在这里能用上吗?而 js 中的对象表示语法正好非常方便构造“状态表”和“状态轮换表”,花了1个多小时,完成了这个工作。重构后代码的逻辑可谓豁然开朗,带来的仅仅是配置上的稍许冗余,但是这个完全可以接受的。

    大致的伪代码:

    // 状态表定义
    var statusTable = {
        '状态1': {
            sizeCode: 
    1,
            headerUrl: '
    /test1/test2',
            bodyUrl: 'about:blank',
            showTitle: 
    true,
            showBorder: 
    true,
            showMin: 
    true,
            showMax: 
    false,
            showClose: 
    true
        },
        '状态3': {
            sizeCode: 
    2,
            headerUrl: '
    /test1/test2',
            bodyUrl: '
    /test1/test2',
            showTitle: 
    true,
            showBorder: 
    true,
            showMin: 
    true,
            showMax: 
    true,
            showClose: 
    true
        },
        '状态4': {
            sizeCode: 
    3,
            headerUrl: '
    /test1/test2',
            bodyUrl: '
    /test1/test2',
            showTitle: 
    true,
            showBorder: 
    true,
            showMin: 
    true,
            showMax: 
    false,
            showClose: 
    true
        },
        '状态2': {
            sizeCode: 
    2,
            headerUrl: '
    /test1/test2',
            bodyUrl: '
    /test1/test2',
            showTitle: 
    true,
            showBorder: 
    true,
            showMin: 
    true,
            showMax: 
    false,
            showClose: 
    true
        }
    };
    // 当前状态码
    var currentStatusCode = '';

    // 切换到状态机某个状态   
    function loadStatus(code){
        
    var status = statusTable[code] || null;
        
    if(!status) return;
        
        
    // update other status
        // 利用 status 做一系列设置。。如显示隐藏按钮等
        // 
        
        currentStatusCode 
    = code;
    }

    // 示例函数 foo 和 bar.
    //
     一个函数是一套自定义的逻辑,定义一个状态轮换表即可实现。
    function foo(){
        
    var jumpTable = {
            '状态1': '',
            '状态2': '状态1',
            '状态3': '状态4',
            '状态4': ''
        };
        loadStatus(jumpTable[currentStatusCode] 
    || '');
    }

    function bar(){
        
    var jumpTable = {
            '状态1': '状态2',
            '状态2': '',
            '状态3': '状态1',
            '状态4': '状态3'
        };
        loadStatus(jumpTable[currentStatusCode] 
    || '');
    }
  • 相关阅读:
    Activity(活动)生命周期(1)--返回栈
    探究Activity(1)--Activity的基本用法
    Z-Stack协议栈网络号与信道号的设置
    如何搭建自己的网站到远程服务器(亲测有效)
    新手搭建springmvc+mybits框架的经验分享
    spring+mybits 整合所需jar包的下载路径(亲测有效)
    Map集合的四种常用遍历方式整理
    java设计模式----单例模式
    浅谈H5技术
    jsp内置对象分析
  • 原文地址:https://www.cnblogs.com/RChen/p/js_state_machine.html
Copyright © 2011-2022 走看看