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 相关文章推荐
基于jquery的bankInput银行卡账号格式化
Aug 22 Javascript
JS动态添加与删除select中的Option对象(示例代码)
Dec 20 Javascript
jQuery背景插件backstretch使用指南
Apr 21 Javascript
javascript常用函数(1)
Nov 04 Javascript
很不错的两款Bootstrap Icon图标选择组件
Jan 28 Javascript
jQuery基于Ajax方式提交表单功能示例
Feb 10 Javascript
Bootstrap实现可折叠分组侧边导航菜单
Mar 07 Javascript
小程序多图列表实现性能优化的方法步骤
May 28 Javascript
JS/CSS实现字符串单词首字母大写功能
Sep 03 Javascript
详解如何在JS代码中消灭for循环
Dec 11 Javascript
TypeScript高级用法的知识点汇总
Dec 17 Javascript
vue编写简单的购物车功能
Jan 08 Vue.js
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
让你的网站首页自动选择语言转跳
2006/12/06 PHP
php中使用cookie来保存用户登录信息的实现代码
2012/03/08 PHP
PHP中file_exists函数不支持中文名的解决方法
2014/07/26 PHP
Laravel timestamps 设置为unix时间戳的方法
2019/10/11 PHP
一段利用WSH修改和查看IP配置的代码
2008/05/11 Javascript
IE不支持getElementsByClassName最终完美解决方案
2012/12/17 Javascript
JS获取html对象的几种方式介绍
2013/12/05 Javascript
JavaScript获取图片的原始尺寸以宽度为例
2014/05/04 Javascript
javascript中的__defineGetter__和__defineSetter__介绍
2014/08/15 Javascript
一段非常简单的js判断浏览器的内核
2014/08/17 Javascript
[原创]推荐10款最热门jQuery UI框架
2014/08/19 Javascript
node.js中的events.emitter.listeners方法使用说明
2014/12/10 Javascript
javaScript中push函数用法实例分析
2015/06/08 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
2017/01/04 Javascript
微信小程序 开发经验整理
2017/02/15 Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
2017/03/08 Javascript
node.js学习之事件模块Events的使用示例
2017/09/28 Javascript
微信小程序将字符串生成二维码图片的操作方法
2018/07/17 Javascript
微信小程序使用map组件实现路线规划功能示例
2019/01/22 Javascript
Vue学习之常用指令实例详解
2020/01/06 Javascript
Node.js中文件系统fs模块的使用及常用接口
2020/03/06 Javascript
解决vue初始化项目一直停在downloading template的问题
2020/11/09 Javascript
python中类和实例如何绑定属性与方法示例详解
2017/08/18 Python
详解用Python处理HTML转义字符的5种方式
2017/12/27 Python
PyCharm代码整体缩进,反向缩进的方法
2018/06/25 Python
Python 判断文件或目录是否存在的实例代码
2018/07/19 Python
在cmder下安装ipython以及环境的搭建
2018/10/19 Python
Jupyter Notebook折叠输出的内容实例
2020/04/22 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
2020/11/28 Python
美国亚马逊旗下男装网站:East Dane(支持中文)
2019/09/25 全球购物
档案检查欢迎词
2014/01/13 职场文书
弘扬职业精神演讲稿
2014/03/20 职场文书
劳动仲裁调解书
2015/05/20 职场文书
课程设计感想范文
2015/08/11 职场文书
CSS font-variation 可变字体的魅力(实例详解)
2022/03/03 HTML / CSS
《杜鹃的婚约》OP主题曲「凸凹」无字幕影像公开
2022/04/08 日漫