资讯专栏INFORMATION COLUMN

状态模式

Eric / 655人阅读

摘要:在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的对象。缺点状态模式的使用必然会增加系统类和对象的个数。状态模式是指允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。

状态模式
在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。
在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。
意图主要解决
允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类
对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。
优点

封装了转换规则。

枚举可能的状态,在枚举状态之前需要确定状态种类。

将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。

允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。

可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。

缺点

状态模式的使用必然会增加系统类和对象的个数。

状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。

状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。

状态模式实现

class Menu

我们使用es6实现一个类的创建, 便于我们多个地方重复使用,其实状态模式是要根据你的状态
来实现或者操作你想要的东西
    class Menu{
    }

状态对象

创建一个状态对象或者数组,内部保存状态变量,然后内部封装好每种动作对应的状态,然后状态对象返回一个接口对象,它可以对内部的状态修改或者调用。
    this.menuStates = {
        hide:function () {
            console.log("hide")
        },
        show: function () {
            console.log("show")
        },
        left: function () {
            console.log("left")
        },
        right: function () {
            console.log("right")
        }
    }

上面就是我们的状态对象,一共有四个状态函数,做出不同的操作和实现

具体的使用函数

触发我们要执行的状态,state是我要传递callback函数参数,我们会根据传递的函数进行调用执行它,当然在执行过程当中
我们还可以设定使用其它的抽象类,以达到我们想要的单一原则,不要在乎是不是这样写比以前那样代码还多了,
确实会多,但是复用的时候你再看看是否还会再那么的繁琐以及更多的代码编写
    toggle (state) {
        state()
    }
代码组合实现



    
    Title


class Menu {
    constructor(state){
        this.num = 1
        this.menuStates = {
            hide:function () {
                console.log("hide")
            },
            show: function () {
                console.log("show")
            },
            left: function () {
                console.log("left")
            },
            right: function () {
                console.log("right")
            }
        }
    }
    toggle (state) {
        state()
    }
}

    var menu = new Menu()
    console.log(menu)
    menu.toggle(menu.menuStates.show)
    menu.toggle(menu.menuStates.hide)


上面图片就是我们得到的结果我们会发现menu构造函数是拥有四个状态函数,我们通过使用toggle函数来调用我们的函数,其实说白了状态模式相对于其它模式还是比较简单的,但是对于它的使用场景你要了解,你是否可以真正的运用它,以及把它放在适用的场景上。
状态模式是指允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。以逗号分割,把这句话分为两部分来看。第一部分的意思是将状态封装成独立的类,并将请求委托给当前的状态对象,当对象的内部状态改变时,会带来不同的行为变化。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/105155.html

相关文章

  • JS 状态模式

    摘要:简介状态模式允许一个对象在其内部状态改变的时候改变它的行为,对象看起来似乎修改了它的类。状态通常为一个或多个枚举常量的表示。简而言之,当遇到很多同级或者的时候,可以使用状态模式来进行简化。 1. 简介 状态模式(State)允许一个对象在其内部状态改变的时候改变它的行为,对象看起来似乎修改了它的类。其实就是用一个对象或者数组记录一组状态,每个状态对应一个实现,实现的时候根据状态挨个去运...

    xingqiba 评论0 收藏0
  • 一起学设计模式 - 备忘录模式

    摘要:备忘录模式常常与命令模式和迭代子模式一同使用。自述历史所谓自述历史模式实际上就是备忘录模式的一个变种。在备忘录模式中,发起人角色负责人角色和备忘录角色都是独立的角色。 备忘录模式(Memento Pattern)属于行为型模式的一种,在不破坏封装特性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态。 概述 备忘录模式又叫做快照模式(...

    roland_reed 评论0 收藏0
  • FSM状态机之状态模式

    摘要:要注意这里的一个状态行为因为这个词是状态模式中最重要的个概念。考虑到这点,聪明的在中推出了状态机这个伪函数,能够帮助我们快速实现状态化。这里就引入了状态机这个概念,以及和他对应的状态表。  首先声明一点,这个模式是我目前见过最好用(本人观点),但是也是最难理解的一个(本人观点)。 所以大家需要做好心理准备,如果,对这个模式没有特别强烈的需求,比如: 我有一个Button,我按次数点击它...

    k00baa 评论0 收藏0
  • 设计模式状态模式

    摘要:为了实现这个正义偷笑又合理的诉求,你得先学会今天要介绍的设计模式,因为你们公司的这个流程可能就是用今天这个模式设计的。状态模式对开闭原则的支持并不太好,新增状态时,不仅得增加状态类,还得修改原来已经有的状态,让之前的状态切换到新增的状态。一、定义你是否经常请(偷)假(懒)?是不是对公司万恶的请假申请流程深恶痛绝。有没有想过偷偷改造这个万恶的系统,从 申请->项目经理审批->部门审批->老板审...

    zhangke3016 评论0 收藏0
  • 前端设计模式用起来(1)状态模式

    摘要:有限状态机可以归纳出四个要素现态即当前的状态。但状态模式还有一点需要注意到,当采用子类继承实现多种具体状态的时候,注意控制状态的数量,以免出现子类数量膨胀的现象在使用或等更完整面向对象语言时。 业务代码开发久了,偶尔看看设计模式,总会让自己有一种清新脱俗的感觉。总想把这种感觉记下来,但一想到要先起个恰如其分的标题和开头,就让我有一种百爪挠心的纠结,所以迟迟没有开始。今天起更新我学习设计...

    Salamander 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<