状态机

  • 不同状态下的相同操作
游戏状态机
播放器状态机
  • 灯开关示例
    /**
     * 灯
     */
    function Light()
    {
        
        var _state = new StateOFF();
        
        /**
         * 更改状态
         */
        function state(v)
        {
            _state = v;
        }
        
        
        /**
         * 开
         */
        function open()
        {
            _state.open(this)
        }
        
        
        /**
         * 关
         */
        function close()
        {
            _state.close(this)
        }
        
        
        return{
            
            state:state,
            open:open,
            close:close
        }
    }
    
    
    
    /**
     * 灯开着的状态
     */
    function StateON()
    {
        
        function open(light)
        {
            console.log('本次操作被忽略,灯处于打开状态')
        }
        
        function close(light)
        {
            light.state(new StateOFF())
            console.log('关灯成功')
        }
        
        return{
            
            open:open,
            close:close
        }
    }
    
    
    
    /**
     * 灯关着的状态
     */
    function StateOFF()
    {
        
        function open(light)
        {
            light.state(new StateON())
            console.log('开灯成功')
        }
        
        function close(light)
        {
            console.log('本次操作被忽略,灯处于关闭状态')
        }
        
        return{
            
            open:open,
            close:close
        }
    }
    
    
    
    /**
     * 测试应用
     */
    var light = new Light();
    
    /**
     * 侦听用户交互
     */
    window.addEventListener('click',function(e)
    {
        
        if(e.target.id == 'on')
        {
            light.open()
        }
        else
        {
            light.close()
        }
    })
  • 游戏状态机示例
    /**
     * 游戏人物
     */
    function Person()
    {
        
        /**
         * 默认状态
         */
        var _state = new StateStand();
        
        
        /**
         * 切换状态
         */
        function state(v)
        {
            _state = v;
        }
        
        
        /**
         * 上
         */
        function top()
        {
            _state.top(this)
        }
        
        
        /**
         * 下
         */
        function bottom()
        {
            _state.bottom(this)
        }
        
        
        return{
            
            state:state,
            top:top,
            bottom:bottom
        }
        
    }
    
    
    
    /**
     * 站立状态
     */
    function StateStand()
    {
        
        /**
         * 上
         */
        function top(p)
        {
            console.log('切换到跳跃状态');
            p.state(new StateJump())
        }
        
        
        /**
         * 下
         */
        function bottom(p)
        {
            console.log('切换到下蹲状态')
            p.state(new StateSquat())
        }
        
        return{
            
            top:top,
            bottom:bottom
        }
    }
    
    
    /**
     * 跳跃
     */
    function StateJump()
    {
        /**
         * 上
         */
        function top(p)
        {
            console.log('此操作忽略,跳跃中不能再次跳跃')
        }
        
        /**
         * 下
         */
        function bottom(p)
        {
            console.log('切换到下斩状态')
            p.state(new StateBehead())
        }
        
        return{
            
            top:top,
            bottom:bottom
        }
    }
    
    
    /**
     * 下斩
     */
    function StateBehead()
    {
        /**
         * 上
         */
        function top(p)
        {
            console.log('切换到站立状态')
            p.state(new StateStand())
        }
        
        /**
         * 下
         */
        function bottom()
        {
            console.log('此操作忽略,下斩中不能再次下斩')
        }
        
        return{
            
            top:top,
            bottom:bottom
        }
    }
    
    
    /**
     * 下蹲
     */
    function StateSquat()
    {
        /**
         * 上
         */
        function top(p)
        {
            console.log('请按下键释放')
        }
        
        /**
         * 下
         */
        function bottom(p)
        {
            console.log('切换到站立状态')
            p.state(new StateStand())
        }
        
        return{
            
            top:top,
            bottom:bottom
        }
    }
    
    
    
    
    
    /**
     * 游戏状态机应用
     */
    var person = new Person();
    
    
    window.addEventListener('keydown',function(e)
    {
        
        if(e.keyCode == '38')
        {
            person.top();
        }
        
        if(e.keyCode == '40')
        {
            person.bottom();
        }
    })
  • 播放器状态机
    /**
     * 播放器
     */
    function Player(video)
    {
        
        
        /**
         * 默认状态
         */
        var _state = new StateStop();
        
        
        /**
         * 切换状态
         */
        function state(v)
        {
            _state = v;
        }
        
        
        /**
         * 播放
         */
        function play()
        {
            _state.play(this)
        }
        
        
        /**
         * 暂停
         */
        function pause()
        {
            _state.pause(this)
        }
        
        
        /**
         * 停止
         */
        function stop()
        {
            _state.stop(this)
        }
        
        
        return{
            
            video:video,
            state:state,
            play:play,
            pause:pause,
            stop:stop
        }
        
    }
    
    
    
    /**
     * 停止状态
     */
    function StateStop()
    {
        
        /**
         * 播放
         */
        function play(p)
        {
            
            console.log('切换到播放状态')
            p.state(new StatePlay());
            p.video.play();
        }
        
        
        /**
         * 暂停
         */
        function pause(p)
        {
            console.log('此操作被忽略,停止中不可暂停')
        }
        
        
        /**
         * 停止
         */
        function stop(p)
        {
            console.log('此操作被忽略,停止中不可再次停止')
        }
        
        
        return{
            
            play:play,
            pause:pause,
            stop:stop
        }
        
    }
    
    
    /**
     * 播放状态
     */
    function StatePlay()
    {
        
        /**
         * 播放
         */
        function play(p)
        {
            console.log('此操作被忽略,播放中不可再次播放')
        }
        
        
        /**
         * 暂停
         */
        function pause(p)
        {
            console.log('切换到暂停状态')
            p.state(new StatePause());
            p.video.pause();
        }
        
        
        /**
         * 停止
         */
        function stop(p)
        {
            console.log('切换到停止状态')
            p.state(new StateStop());
            //p.video.stop();
        }
        
        
        return{
            
            play:play,
            pause:pause,
            stop:stop
        }
        
    }
    
    
    /**
     * 暂停状态
     */
    function StatePause()
    {
        
        /**
         * 播放
         */
        function play(p)
        {
            console.log('切换到播放状态')
            p.state(new StatePlay());
            p.video.play();
        }
        
        
        /**
         * 暂停
         */
        function pause(p)
        {
            console.log('此操作被忽略,暂停中不可再次暂停')
        }
        
        
        /**
         * 停止
         */
        function stop(p)
        {
            console.log('切换到停止状态')
            p.state(new StateStop());
            //p.video.stop();
        }
        
        
        return{
            
            play:play,
            pause:pause,
            stop:stop
        }
        
    }
    
    
    
    
    /**
     * 测试播放状态机
     */
    
    var player = new Player(document.getElementsByTagName('video')[0]);
    
    
    window.addEventListener('click',function(e)
    {
        
        if(e.target.id == 'play')
        {
            player.play()
        }
        
        
        if(e.target.id == 'pause')
        {
            player.pause()
        }
        
        
        if(e.target.id == 'stop')
        {
            player.stop()   
        }
        
    })
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 状态机是无论科研探索还是科技应用方面都非常重要的一种分析工具。几乎在所有涉及到随时间演化的问题中,都可以找到状态机...
    Esmool阅读 4,324评论 0 26
  • 这个系列最终实现的状态机并不是一个标准的状态机,把状态机的很多标准的概念进行了简化,对概念的东西做了减法,实现了具...
    iPolaris阅读 34,821评论 2 40
  • 上一篇文章写完之后,我一直在想做一个游戏示例,想将之前学到的状态机模式运用在其中。然而一直遇到各种奇怪的bug(之...
    qufl阅读 2,512评论 0 52
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 『代码github地址』 标签: 有限状态机,Akka fsm,squirrel-foundation,java状...
    醉叁重阅读 29,808评论 3 24