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 相关文章推荐
iframe 自适应高度[在IE6 IE7 FF下测试通过]
Apr 13 Javascript
模拟select的代码
Oct 19 Javascript
基于jquery跨浏览器显示的file上传控件
Oct 24 Javascript
asm.js使用示例代码
Nov 28 Javascript
javascript获取和判断浏览器窗口、屏幕、网页的高度、宽度等
May 08 Javascript
jQuery统计指定子元素数量的方法
Mar 17 Javascript
AngularJS 2.0新特性有哪些
Feb 18 Javascript
jQuery+ajax简单实现文件上传的方法
Jun 03 Javascript
实例解析ES6 Proxy使用场景介绍
Jan 08 Javascript
详解webpack运行Babel教程
Jun 13 Javascript
微信小程序支付前端源码
Aug 29 Javascript
Jquery动态列功能完整实例
Aug 30 jQuery
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
第二节 对象模型 [2]
2006/10/09 PHP
PHP 命令行参数详解及应用
2011/05/18 PHP
PHP自定义函数获取汉字首字母的方法
2016/12/01 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
php curl获取到json对象并转成数组array的方法
2018/05/31 PHP
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
2010/06/11 Javascript
jQuery客户端分页实例代码
2013/11/18 Javascript
jquery数组之存放checkbox全选值示例代码
2013/12/20 Javascript
javascript获取checkbox复选框获取选中的选项
2014/08/12 Javascript
jQuery修改class属性和CSS样式整理
2015/01/30 Javascript
浅谈angular.js中实现双向绑定的方法$watch $digest $apply
2015/10/14 Javascript
js点击文本框弹出可选择的checkbox复选框
2016/02/03 Javascript
探究react-native 源码的图片缓存问题
2017/08/24 Javascript
cocos2dx+lua实现橡皮擦功能
2018/12/20 Javascript
[01:03:00]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第一局
2016/02/25 DOTA
[37:23]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第二局
2016/03/04 DOTA
opencv python 图像去噪的实现方法
2018/08/31 Python
面向初学者的Python编辑器Mu
2018/10/08 Python
Pandas的read_csv函数参数分析详解
2019/07/02 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
2019/07/23 Python
python属于解释型语言么
2020/06/15 Python
python如何代码集体右移
2020/07/20 Python
美国在线宠物用品商店:Entirely Pets
2017/01/01 全球购物
比利时的在线灯具店:Lampen24.be
2019/07/01 全球购物
应用艺术专业个人的自我评价
2014/01/03 职场文书
物控部经理职务说明书
2014/02/25 职场文书
干部下基层实施方案
2014/03/14 职场文书
2014最新党员违纪检讨书
2014/10/12 职场文书
群众路线教育实践活动实施方案
2014/10/31 职场文书
个性发展自我评价2015
2015/03/09 职场文书
大学生个人简历自我评价
2015/03/11 职场文书
工作简历自我评价
2015/03/11 职场文书
2015年社区卫生工作总结
2015/04/21 职场文书
nginx proxy_cache 缓存配置详解
2021/03/31 Servers
matplotlib之pyplot模块实现添加子图subplot的使用
2021/04/25 Python
JS的深浅复制详细
2021/10/16 Javascript