zoukankan      html  css  js  c++  java
  • JS模式--状态模式(状态机)

    • 下面的状态机选择通过Function.prototype.call方法直接把请求委托给某个字面量对象来执行。
     var light = function () {
                this.currstate = FSM.off;
                this.button = null;
            };
            light.prototype.init = function () {
                var button = document.createElement('button');
                self = this;
                button.innerHTML = '已关灯';
                this.button = document.body.appendChild(button);
    
                this.button.onclick = function () {
                    self.currstate.buttonWasPressed.call(self);
                };
            };
    
            var FSM = {
                off: {
                    buttonWasPressed: function () {
                        console.log('关灯');
                        this.button.innerHTML = '下一次按我是开灯';
                        this.currstate = FSM.on;
                    }
                },
                on: {
                    buttonWasPressed: function () {
                        console.log('开灯');
                        this.button.innerHTML = '下一次按我是关灯';
                        this.currstate = FSM.off;
                    }
                }
            };
            var light = new light();
            light.init();
    •  下面利用delegate函数来重写一遍这个状态机
    • 这是面向对象和闭包互换的一个例子。前者将变量保存为对象的属性,后者将变量封闭在闭包形成的环境中
    var delegate = function (client, delegation) {
                return {
                    buttonWasPressed: function () {
                        return delegation.buttonWasPressed.apply(client, arguments);
                    }
                };
            };
    
            var light = function () {
                this.offstate = delegate(this, FSM.off);
                this.onstate = delegate(this, FSM.on);
                this.currstate = FSM.off;
                this.button = null;
            };
            light.prototype.init = function () {
                var button = document.createElement('button');
                self = this;
                button.innerHTML = '已关灯';
                this.button = document.body.appendChild(button);
    
                this.button.onclick = function () {
                    self.currstate.buttonWasPressed.call(self);
                };
            };
    
            var FSM = {
                off: {
                    buttonWasPressed: function () {
                        console.log('关灯');
                        this.button.innerHTML = '下一次按我是开灯';
                        this.currstate = this.onstate;
                    }
                },
                on: {
                    buttonWasPressed: function () {
                        console.log('开灯');
                        this.button.innerHTML = '下一次按我是关灯';
                        this.currstate = this.offstate;
                    }
                }
            };
            var light = new light();
            light.init();

     
    Github上有另外一种方式:

    https://github.com/jakesgordon/javascript-state-machine

  • 相关阅读:
    Table to List<object> C#
    Edge Beta 进入无痕模式 快捷方式
    C# 按行读取文件 从某行开始取
    Navicat连接oracle,出现Only compatible with oci version 8.1
    未能找到 System.Web.Helpers
    js json 排序
    使用 NPM 安装Vue并创建项目
    css3动效
    回忆向——诺宝RC机器人仿真
    javascript问题
  • 原文地址:https://www.cnblogs.com/meiyh/p/6515477.html
Copyright © 2011-2022 走看看