设计模式知识连载(28)---状态模式:

来源:互联网 发布:女生必知 编辑:程序博客网 时间:2024/05/17 00:03
<body><h3>设计模式知识连载(28)---状态模式:</h3><p>    当一个对象的内部状态发生改变时,会导致其行为的改变,这看起来像是改变了对象</p><hr><script type="text/javascript">    /**    *   案例一:图片展示,方式一:初始    */    // 展示结果:    function showResult(result) {        if(result == 0) {            console.log('result=0')         }else if(result == 1) {            console.log('result=1')         }else if(result == 2) {            console.log('result=2')         }else if(result == 3){            console.log('result=3')         }    }    /**    *   案例一:图片展示,方式二:状态模式    */    //投票结果状态对象    var ResultState = function() {        // 判断结果保存在内部状态中        var States = {            // 每种状态作为一种独立方法保存            state0 : function() {                console.log('state0') ;            },            state1 : function() {                console.log('state1') ;            },            state2 : function() {                console.log('state2') ;            },            state3 : function() {                console.log('state3') ;            }        }        // 获取某一种状态并执行其对应的方法        function show(result) {            States['state' + result] && States['state' + result]() ;        }        // 返回调用状态方法接口        return {            show : show         }    } ;    // 测试实例:    // var result_state = new ResultState() ;    // result_state.show(3) ;    /**    *   案例二:超级玛丽,方式一:初始状态    */    //单动作条件判断,每增加一个动作就需要添加一个判断    var lastAction_single = '' ;    function changeMarry_single(action) {        if(action == 'jump') {            console.log('进行了跳跃动作') ;        }else if(action == 'move') {            console.log('进行了移动动作') ;        }else{            console.log('进行了默认动作') ;        }         lastAction_single = action ;    }     // console.log('单动作条件判断------------') ;    // changeMarry_single('jump') ;    // 复合动作对条件判断的开销是翻倍的    var lastAction1_complex = '' ;    var lastAction2_complex = '' ;    function changeMarry_complex(action1, action2) {        if(action1 == 'shoot' && action2 == '') {            console.log('进行了射击动作') ;        }        else if(action1 == 'jump' && action2 == '') {            console.log('进行了跳跃动作');        }        else if(action1 == 'move' && action2 == 'shoot') {            console.log('进行了移动射击动作') ;        }else if(action1 == 'jump' && action2 == 'shoot') {            console.log('进行了跳跃射击动作') ;        }else{            console.log('进行了默认动作') ;        }        // 保留上一个动作        lastAction1_complex = action1 || '' ;        lastAction2_complex = action2 || '' ;    }    // console.log('复合动作判断------------') ;    // changeMarry_complex('jump', 'shoot') ;    /**    *   案例二:超级玛丽,方式一:状态优化    */    // 创建超级玛丽状态类    var MarryState = function() {        // 内部状态私有量        var _currentState = {} ;        // 动作与状态方法映射        var states = {            jump : function () {                console.log('jump...【跳跃】') ;            },            move : function() {                console.log('move...【移动】') ;            },            shoot : function() {                console.log('shoot...【射击】') ;            },            squat : function() {                console.log('squat...【蹲下】') ;            }        } ;        // 动作控制类        var Action = {            // 改变状态方法            changeState : function() {                // 组合动作通过传递多个参数实现                var arg = arguments ;                // 重置内部状态                _currentState = {} ;                // 如果有动作则添加动作                if(arg.length) {                    // 遍历动作                    for(var i = 0; i < arg.length; i++) {                        _currentState[arg[i]] = true ;                    }                }                // 返回动作控制类                return this ;            },             // 执行动作            goes : function() {                console.log('触发一次动作') ;                // 遍历内部状态保存的动作                for(var i in _currentState) {                    // 如果该动作存在则执行                    states[i] && states[i]() ;                }                return this ;            }        }        // 返回接口方法:change、gose        return {            change : Action.changeState,            goes : Action.goes        }    }    // 测试实例:    console.log('使用状态后的值:---------') ;    // 直接执行这个状态类    // MarryState()    //  .change('jump', 'shoot')    // 添加跳跃与设计动作    //  .goes()                     // 执行动作    //  .goes()                     // 执行动作    //  .change('shoot')            // 添加射击动作    //  .goes() ;                   // 执行动作    // 实例化这个状态类    // 创建一个    var marry = new MarryState() ;    marry        .change('jump', 'shoot')        .goes()        .goes()        .change('shoot')        .goes() ;</script>   </body>
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 济州联 济州航空app 韩国济州 济州爱情乐园 韩国哪里好玩 韩国有什么好玩的 去韩国旅游攻略 韩国旅行团 韩国跟团游 韩国攻略 韩国旅行 韩国游攻略 韩国旅游景点 韩国有什么岛 济慈 济慈的诗 济慈简介 keats 济时拯世 会有时直挂云帆济沧海 济柴发电机 济柴 济柴发电机组1000kw 济柴发电机组 济柴发电机组价格 000617 济源 济源论坛 济源市 河南济源 济源邮编 济源论坛今日济源 济源论坛网 济源文明网 济源二手房 济源就业网 济源教育网 济源网 济源旅游 郑州济源 济源景点