Javascript设计模式 - 18 - 状态模式

简介

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

通常我们谈到封装,一般都会优先封装对象的行为,而不是对象的状态,但在状态模式中刚好相反,状态模式的关键是把事物的每种状态都封装成单独的类,跟此种状态有关的行为都被封装在这个类的内部,执行上下文中,请求直接委托给状态对象,该状态对象会负责渲染它自身的行为

定义

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

  • 将状态封装成独立的类,并将请求委托给当前的状态对象,当对象内部状态改变时,会带来不同的行为变化

  • 我们使用对象,在不同的状态下会有不同的行为,这个对象看起来是从不同的类中实例化来的,实际上使用的是委托的效果

优缺点

  • 状态模式定义了状态与行为之间的关系,并将他们封装在一个类中,通过增加新的状态类,很容易增加新的状态和转换
  • 避免执行上下文 Context 无线膨胀,切换状态的逻辑被分布在状态类中,也去掉了 Context 中原本过多的条件分支
  • 用对象代替字符串记录当前状态,使得状态的切换更加的一目了然
  • 缺点是会在系统中定义许多的状态类和对象,另外由于逻辑分散在状态类中,造成了逻辑分散的问题,无法在一个地方看出整个状态机的逻辑
    // 定义状态类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 = function () {// 设置初始状态this.currState = FSM.off;this.button = null;}Light.prototype.init = function () {var button = document.createElement('button');var self = this;button.innerHTML = '已关灯'this.button = document.body.appendChild(button);this.button.onclick = function () {self.currState.buttonWasPressed.call(self);}}var light = new Light();light.init();

状态模式和策略模式

  • 共同点:都封装了一系列的算法或者行为,都有一个上下文、一些策略或者状态类,上下文把请求委托给这些类来执行

  • 不同点:策略模式中,的各个策略类是平等又平行的,他们之间没有任何联系,算法切换是用户主动完成的;而在状态模式中,状态和状态对应的行为是早已被封装好的,状态之间的切换也早被规定完成,“改变行为”这件事情发生在状态模式内部,客户不需要了解这些细节

文章列表

  1. javascript设计模式 – 设计原则
  2. JavaScript设计模式–高阶函数
  3. Javascript 设计模式 - 01 - 原型模式
  4. Javascript 设计模式 - 02 - 单例模式
  5. Javascript 设计模式 - 03 - 建造者模式
  6. Javascript 设计模式 - 04 - 工厂模式
  7. Javascript 设计模式 - 05 - 外观模式
  8. Javascript 设计模式 - 06 - 代理模式
  9. Javascript 设计模式 - 07 - 观察者模式(发布订阅模式)
  10. Javascript 设计模式 - 08 - 策略模式
  11. Javascript 设计模式 - 09 - 命令模式
  12. Javascript 设计模式 - 10 - 迭代器模式
  13. Javascript 设计模式 - 11 - 职责链模式
  14. Javascript 设计模式 - 12 - 适配器模式
  15. Javascript 设计模式 - 13 - 模板方法
  16. Javascript 设计模式 - 14 - 组合模式
  17. Javascript 设计模式 - 15 - 享元模式
  18. Javascript 设计模式 - 16 - 中介者模式
  19. Javascript 设计模式 - 17 - 装饰者模式
  20. Javascript 设计模式 - 18 - 状态模式

Javascript设计模式-18-状态模式相关推荐

  1. PHP设计模式之状态模式定义与用法详解

    本文实例讲述了PHP设计模式之状态模式定义与用法.分享给大家供大家参考,具体如下: 什么是状态设计模式 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当 ...

  2. JavaScript设计模式-享元模式

    JavaScript设计模式-享元模式 概念 例子 内部状态与外部状态 享元模式的通用结构 例子 总结 github仓库地址:点击 [设计模式例子](https://github.com/fanhua ...

  3. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  4. python的编程模式-Python设计模式之状态模式原理与用法详解

    本文实例讲述了Python设计模式之状态模式原理与用法.分享给大家供大家参考,具体如下: 状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 ...

  5. java设计模式之状态模式_Java中的状态设计模式

    java设计模式之状态模式 在本教程中,我们将探讨另一种流行的行为设计模式-状态设计模式. 当我们使用可以存在于多个状态的对象时,状态设计模式的知识变得非常有用. 当对象的行为取决于其当前状态时,我们 ...

  6. 【转】设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  7. 图解java多线程设计模式 pdf_图解Java设计模式之状态模式

    图解Java设计模式之状态模式 APP抽象活动问题 状态模式基本介绍 状态模式的原理类图 状态模式解决APP抽奖问题 状态模式的注意事项和细节 APP抽象活动问题 请编写程序完成APP抽象活动,具体要 ...

  8. android 状态模式,Android编程设计模式之状态模式详解

    本文实例讲述了Android编程设计模式之状态模式.分享给大家供大家参考,具体如下: 一.介绍 状态模式中的行为是由状态来决定的,不同的状态下有不同的行为.状态模式和策略模式的结构几乎完全一样,但它们 ...

  9. python的out模式_Python设计模式之状态模式

    状态模式 面向对象编程着力于在对象交互时改变它们的状态.在很多问题中,有限状态机(通常名为状态机)是一个非常方便的状态转换建模(并在必要时以数学方式形式化)工具.首先,什么是状态机?状态机是一个抽象机 ...

  10. 码农小白 设计模式篇 状态模式

    码农小白 设计模式篇 状态模式 1.状态的认识 2.面向过程思维的代码实现 小结: 3.面向对象实现 小结 4.用状态模式实现 1.状态模式的简介 2.状态模式的好处 3.状态模式的使用 4.代码实现 ...

最新文章

  1. 编写程序实验两个数的加减结果的判断_实验一 两个多字节数的加减运算 -
  2. linux系统宿主定制之初窥门径
  3. 使用powerdesigner设计类图并生成代码
  4. NYOJ 536 开心的mdd
  5. Java多线程初学者指南(5):join方法的使用
  6. hdu 4302 STL multiset
  7. 使用action framework 实现order change时自动发送邮件
  8. [转帖] 启动多个Tomcat 需要修改的端口
  9. RocketMQ 部署不当导致磁盘空间不释放
  10. python main函数
  11. TSAP(4) : 时间序列采样[asfreq( ) VS resample( )]
  12. R 计算平均值标准误差
  13. 工业以太网串口网关ENB-301MT
  14. Python实现随机漫步
  15. 暗态图像处理论文:A Bio-Inspired Multi-Exposure Fusion Framework for Low-light Image Enhancement
  16. onlyoffice 自动保存_onlyoffice服务在线编辑文档保存解析
  17. Python 批量提取Excel中的图片,图片文件名按指定列存储
  18. android app性能优化大汇总(UI渲染性能优化)
  19. cocos植物大战僵尸(三)游戏场景:地图滚动
  20. RocksDB 概述

热门文章

  1. 西门子plc与ABB510变频器modbus通讯
  2. 计算机识别图像的原理,什么是图像识别技术?图像识别技术原理介绍
  3. 模拟电路47(有源滤波器2-二阶低通滤波器)
  4. 基于RFID定位技术的智能仓储管理系统--RFID智能仓储--新导智能
  5. 3DMax、Unity、Threejs旋转转换
  6. 【控制control】动力学基础
  7. 图像入门:MATLAB图像识别
  8. GANDCRAB V5.2勒索病毒,不可破解,尽快防御!
  9. 前端学习笔记之品优购项目(一) 3.15
  10. 计算机发展史说课ppt,创新杯 计算机类 说课ppt课件.ppt