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 相关文章推荐
javascript实现 在光标处插入指定内容
May 25 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
Apr 02 Javascript
js 获取页面高度和宽度兼容 ie firefox chrome等
May 14 Javascript
jquery根据锚点offset值实现动画切换
Sep 11 Javascript
js在指定位置增加节点函数insertBefore()用法实例
Jan 12 Javascript
浅谈Unicode与JavaScript的发展史
Jan 19 Javascript
浅析JavaScript中的事件机制
Jun 04 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(二)之数据支持json字符串、list集合
Aug 11 Javascript
微信小程序 生命周期详解
Oct 12 Javascript
网络传输协议(http协议)
Nov 18 Javascript
javascript 取小数点后几位几种方法总结
Aug 02 Javascript
Vue中引入svg图标的两种方式
Jan 14 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
PHP开发框架总结收藏
2008/04/24 PHP
PHP英文字母大小写转换函数小结
2014/05/03 PHP
php+ajax 实现输入读取数据库显示匹配信息
2015/10/08 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
phpmyadmin在宝塔面板里进不去的解决方案
2020/07/06 PHP
prototype 中文参数乱码解决方案
2009/11/09 Javascript
js DOM的学习笔记
2011/12/22 Javascript
Array.prototype.concat不是通用方法反驳[译]
2012/09/20 Javascript
jQuery(非HTML5)可编辑表格实现代码
2012/12/11 Javascript
使用upstart把nodejs应用封装为系统服务实例
2014/06/01 NodeJs
js获取字符串字节数方法小结
2015/06/09 Javascript
理解和运用JavaScript的闭包机制
2015/08/13 Javascript
Javascript小技能总结(推荐)
2016/06/02 Javascript
Bootstrap的fileinput插件实现多文件上传的方法
2016/09/05 Javascript
微信小程序 二维码canvas绘制实例详解
2017/01/06 Javascript
vue实现个人信息查看和密码修改功能
2018/05/06 Javascript
Javascript实现html转pdf高清版(提高分辨率)
2020/02/19 Javascript
在Angular中实现一个级联效果的下拉框的示例代码
2020/05/20 Javascript
Python的SimpleHTTPServer模块用处及使用方法简介
2018/01/22 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
2019/01/19 Python
django 捕获异常和日志系统过程详解
2019/07/18 Python
在Python中使用MySQL--PyMySQL的基本使用方法
2019/11/19 Python
Python解析json代码实例解析
2019/11/25 Python
Python实现查找数据库最接近的数据
2020/06/08 Python
无惧面试,带你搞懂python 装饰器
2020/08/17 Python
应届毕业生个人自我评价
2013/09/20 职场文书
财务方面个人工作的自我评价
2013/12/28 职场文书
市级文明单位申报材料
2014/05/07 职场文书
硕士生找工作求职信
2014/07/05 职场文书
2014年妇幼保健工作总结
2014/12/08 职场文书
2015大学生自我评价范文
2015/03/03 职场文书
2015年暑期实践报告范文
2015/07/13 职场文书
法院执行局工作总结
2015/08/11 职场文书
Redis5之后版本的高可用集群搭建的实现
2021/04/27 Redis
MySQL 主从复制数据不一致的解决方法
2022/03/18 MySQL