javascript设计模式 ? 状态模式原理与用法实例分析


Posted in Javascript onApril 22, 2020

本文实例讲述了javascript设计模式 ? 状态模式原理与用法。分享给大家供大家参考,具体如下:

介绍:状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。状态模式将一个对象的状态从该对象中分离出来,使得对象状态可以灵活变化。

定义:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类,其别名为状态对象,状态模式是一种对象行为型模式。

场景:在很多情况下我们的页面需要做一些状态判断,是否注册,是否登录,剩余金额是否大于500等等,我们通常是在组件中通过if…else…来做不同的处理,这种方式耦合严重不满足单一职责原则。如何解决这个问题呢,这一节我们利用状态模式来解决对象的状态切换。

示例:

var Dialog = function(){
  var _state = null;
 
  this.setState = function(state){
    _state = state;
  }
  this.getState = function(){
    return _state;
  }
}
 
var ShowState = function(){
  this.doAction = function(dialog){
    console.log("对Dialog设置显示状态:");
    dialog.setState(this);
  }
  this.toString = function(){
    console.log("显示中......");
  }
}
 
var HideState = function(){
  this.doAction = function(dialog){
    console.log("对Dialog设置隐藏状态:");
    dialog.setState(this);
  }
  this.toString = function(){
    console.log("已隐藏......");
  }
}
 
var dialog = new Dialog();
 
var showState = new ShowState();
var hideState = new HideState();
 
showState.doAction(dialog);
//对Dialog设置显示状态:
dialog.getState().toString();
//显示中......
hideState.doAction(dialog);
//对Dialog设置隐藏状态
dialog.getState().toString();
//已隐藏......

这个例子里Dialog对象有两种状态,显示和隐藏,我把两种状态提取出来,使得状态的管理更加灵活。在这个例子里面Dialog称之为环境类,环境类又称为上下文类,他拥有多种状态。环境类内部需要维护一个state对象用来定义当前状态。HideState,ShowState称之为状态类,对应环境类的一个具体状态,toString称之为状态类的行为,每一个状态类的行为都有所不同。

状态模式总结:

优点:
* 封装了状态的转换规则,在状态模式中可以将状态的转换代码封装在环境类或者具体状态类中,方便对状态转换代码进行管理。
* 将所有与某个状态有关的行为放到一个类中,只需要注入一个不同的状态对象即可使环境对象拥有不同行为

缺点:
* 状态模式的使用必然会增加系统中状态类的数量,导致开销变大。
* 结构设计交付为咋,使用不当会导致程序结构和代码混乱,增加系统设计难度。

适用场景:
* 对象的行为依赖于它的状态,状态改变将导致行为的变化
* 在代码中包含大量与对象状态有关的条件语句

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
ext for eclipse插件安装方法
Apr 27 Javascript
基于JQuery框架的AJAX实例代码
Nov 03 Javascript
jquery.Jwin.js 基于jquery的弹出层插件代码
May 23 Javascript
高性能JavaScript循环语句和条件语句
Jan 20 Javascript
AngulerJS学习之按需动态加载文件
Feb 13 Javascript
Vue组件开发初探
Feb 14 Javascript
Bootstrap modal 多弹窗之叠加显示不出弹窗问题的解决方案
Feb 23 Javascript
vue中如何动态绑定图片,vue中通过data返回图片路径的方法
Feb 07 Javascript
vue实现可视化可拖放的自定义表单的示例代码
Mar 20 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
Aug 04 Javascript
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
Sep 03 jQuery
最新最全的手机号验证正则表达式
Feb 24 Javascript
Vue computed 计算属性代码实例
Apr 22 #Javascript
js 解析 JSON 数据简单示例
Apr 21 #Javascript
react 原生实现头像滚动播放的示例
Apr 21 #Javascript
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
Apr 21 #Javascript
javascript设计模式 ? 策略模式原理与用法实例分析
Apr 21 #Javascript
javascript设计模式 ? 备忘录模式原理与用法实例分析
Apr 21 #Javascript
VUE+elementui组件在table-cell单元格中绘制微型echarts图
Apr 20 #Javascript
You might like
php代码中使用换行及(\n或\r\n和br)的应用
2013/02/02 PHP
thinkphp模板输出技巧汇总
2014/11/24 PHP
php实现模拟登陆方正教务系统抓取课表
2015/05/19 PHP
PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
2017/07/27 PHP
Yii2框架中一些折磨人的坑
2019/12/15 PHP
禁止直接访问php文件代码分享
2020/05/05 PHP
jQuery 过滤方法filter()选择具有特殊属性的元素
2014/06/15 Javascript
js随机生成网页背景颜色的方法
2015/02/26 Javascript
新手快速学习JavaScript免费教程资源汇总
2015/06/25 Javascript
js中的eval()函数把含有转义字符的字符串转换成Object对象的方法
2016/12/02 Javascript
Validform验证时可以为空否则按照指定格式验证
2017/10/20 Javascript
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
微信小程序云开发如何使用云函数生成二维码
2019/05/18 Javascript
Vue实现日历小插件
2019/06/26 Javascript
在layer弹层layer.prompt中,修改placeholder的实现方法
2019/09/27 Javascript
如何通过javaScript去除字符串两端的空白字符
2020/02/06 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
vue-cli+webpack项目打包到服务器后,ttf字体找不到的解决操作
2020/08/28 Javascript
一个简单的python程序实例(通讯录)
2013/11/29 Python
Python中自定义函数的教程
2015/04/27 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
在pandas多重索引multiIndex中选定指定索引的行方法
2018/11/16 Python
Python时间序列缺失值的处理方法(日期缺失填充)
2019/08/11 Python
python为什么会环境变量设置不成功
2020/06/23 Python
Python SQLAlchemy库的使用方法
2020/10/13 Python
html5 canvas合成海报所遇问题及解决方案总结
2017/08/03 HTML / CSS
匡威爱尔兰官网:Converse爱尔兰
2019/06/09 全球购物
医学院毕业生自荐信
2013/11/08 职场文书
监理资料员岗位职责
2014/01/03 职场文书
给老师的道歉信
2014/01/11 职场文书
给老婆的搞笑检讨书
2014/01/12 职场文书
企业仓管员岗位职责
2014/06/15 职场文书
2014年作风建设工作总结
2014/10/29 职场文书
志愿者个人总结
2015/03/03 职场文书
小学六年级毕业感言
2015/07/30 职场文书
2016年社会管理综治宣传月活动总结
2016/03/16 职场文书