最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Javascript 设计模式 - 状态模式

    正文概述 掘金(alanyf)   2020-12-21   415

    状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。

    这种类型的设计模式属于行为型模式。

    状态模式的关键是区分事物内部的状态,事物内部状态的改变往往会带来事物的行为改变。

    在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。

    介绍

    意图: 允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。

    主要解决: 对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。

    何时使用: 代码中包含大量与对象状态有关的条件语句。

    如何解决: 将各种具体的状态类抽象出来。

    使用场景:

    1. 行为随状态改变而改变的场景。
    2. 条件、分支语句的代替者。

    注意事项: 在行为受状态约束的时候使用状态模式,而且状态不超过 5 个。

    优缺点

    优点:

    1. 封装了转换规则。
    2. 枚举可能的状态,在枚举状态之前需要确定状态种类。
    3. 将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。
    4. 允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。
    5. 可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。

    缺点:

    1. 状态模式的使用必然会增加系统类和对象的个数。
    2. 状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。
    3. 状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。

    应用

    • 文件下载(开始、暂停、完成、失败等)
    • 游戏(走动、攻击、防御、跌倒、跳跃)
    • 红绿灯(红、绿、黄切换)

    状态模式和策略模式的关系

    状态模式和策略模式像一对双胞胎,它们都封装了一系列的算法或者行为,但在意图上有很大不同,因此它们是两种迥然不同的模式。

    策略模式和状态模式的相同点是,它们都有一个上下文、一些策略或者状态类,上下文把请 求委托给这些类来执行。

    它们之间的区别是策略模式中的各个策略类之间是平等又平行的,它们之间没有任何联系, 所以客户必须熟知这些策略类的作用,以便客户可以随时主动切换算法;而在状态模式中,状态 和状态对应的行为是早已被封装好的,状态之间的切换也早被规定完成,“改变行为”这件事情 发生在状态模式内部。对客户来说,并不需要了解这些细节。这正是状态模式的作用所在。

    总结

    状态模式可用来优化条件分支语句、含有大量状态且行为随状态改变而改变的场景。一开始不太好理解,但使用得当可以让代码的结构变得非常清晰和可扩展。

    参考

    • JavaScript设计模式与开发实践
    • 设计模式 - 菜鸟教程

    起源地下载网 » Javascript 设计模式 - 状态模式

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元