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随意添加移除html的实现代码
Jun 21 Javascript
jQuery实现点击小图片淡入淡出显示大图片特效
Sep 09 Javascript
jQuery旋转木马式幻灯片轮播特效
Dec 04 Javascript
JavaScript继承模式粗探
Jan 12 Javascript
html中鼠标滚轮事件onmousewheel的处理方法
Nov 11 Javascript
遍历js中对象的属性和值的实例
Nov 21 Javascript
vue实现添加与删除图书功能
Oct 07 Javascript
vue代码分割的实现(codesplit)
Nov 13 Javascript
vue将后台数据时间戳转换成日期格式
Jul 31 Javascript
Angular8引入百度Echarts进行图表分析的实现代码
Nov 27 Javascript
jQuery实现弹出层效果
Dec 10 jQuery
JavaScript设计模式之策略模式实现原理详解
May 29 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
ThinkPHP php 框架学习笔记
2009/10/30 PHP
PHP CURL模拟GET及POST函数代码
2010/04/25 PHP
php getimagesize 上传图片的长度和宽度检测代码
2010/05/15 PHP
php中存储用户ID和密码到mysql数据库的方法
2013/02/06 PHP
php开启openssl的方法
2014/05/15 PHP
php学习笔记之基础知识
2014/11/08 PHP
Joomla语言翻译类Jtext用法分析
2016/05/05 PHP
php curl优化下载微信头像的方法总结
2018/09/07 PHP
Yii框架分页技术实例分析
2019/08/30 PHP
js实现按钮颜色渐变动画效果
2015/08/20 Javascript
JavaScript实现为input与textarea自定义hover,focus效果的方法
2015/08/21 Javascript
jquery实现滑屏大图定时收缩为小banner图片的广告代码
2015/09/02 Javascript
javascript中日期函数new Date()的浏览器兼容性问题
2015/09/05 Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
2016/08/25 Javascript
AngularJS中run方法的巧妙运用
2017/01/04 Javascript
JavaScript数据结构学习之数组、栈与队列
2017/05/02 Javascript
bootstrap手风琴折叠示例代码分享
2017/05/22 Javascript
详解基于vue-cli优化的webpack配置
2017/11/06 Javascript
webpack4 SplitChunks实现代码分隔详解
2019/05/23 Javascript
使用python将mdb数据库文件导入postgresql数据库示例
2014/02/17 Python
Python多进程通信Queue、Pipe、Value、Array实例
2014/11/21 Python
将python代码和注释分离的方法
2018/04/21 Python
Python基于jieba库进行简单分词及词云功能实现方法
2018/06/16 Python
Python有参函数使用代码实例
2020/01/06 Python
python手机号前7位归属地爬虫代码实例
2020/03/31 Python
Python3实现个位数字和十位数字对调, 其乘积不变
2020/05/03 Python
HTML5的革新 结构之美
2011/06/20 HTML / CSS
Canvas globalCompositeOperation
2018/12/18 HTML / CSS
惠普香港官方商店:HP香港
2019/04/30 全球购物
Berghaus官网:户外服装和设备,防水服
2020/01/17 全球购物
给小学生的新年寄语
2014/04/04 职场文书
企业形象策划方案
2014/05/29 职场文书
我的中国梦演讲稿高中篇
2014/08/19 职场文书
文明礼仪倡议书
2015/04/28 职场文书
格林童话读书笔记
2015/06/30 职场文书
Oracle中update和select 关联操作
2022/01/18 Oracle