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 相关文章推荐
云网广告中的代码,提示出错,大家找找
Nov 21 Javascript
JQuery AJAX实现目录浏览与编辑的代码
Oct 21 Javascript
jQuery toggle()设置CSS样式
Nov 05 Javascript
让你的博客飘雪花超出屏幕依然看得见
Jan 04 Javascript
详解Jquery实现ready和bind事件
Apr 14 Javascript
JS 在数组指定位置插入/删除数据的方法
Jan 12 Javascript
简单实现js进度条加载效果
Mar 25 Javascript
浅谈Angular 中何时取消订阅
Nov 22 Javascript
Vue实现导出excel表格功能
Mar 30 Javascript
vue3.0 CLI - 2.1 -  component 组件入门教程
Sep 14 Javascript
使用vue实现各类弹出框组件
Jul 03 Javascript
云服务器部署Node.js项目的方法步骤(小白系列)
Mar 23 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
shopex中集成的站长统计功能的代码简单分析
2011/08/11 PHP
php基于str_pad实现卡号不足位数自动补0的方法
2014/11/12 PHP
PHP生成腾讯云COS接口需要的请求签名
2018/05/20 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
2019/08/14 PHP
JavaScript 学习笔记之一jQuery写法图片等比缩放以及预加载
2012/06/28 Javascript
Javascript实现视频轮播在pc端与移动端均可
2013/09/29 Javascript
jQuery 快速结束当前正在执行的动画
2013/11/20 Javascript
利用JQuery制作符合Web标准的QQ弹出消息
2014/01/14 Javascript
解决checkbox的attr(checked)一直为undefined问题
2014/06/16 Javascript
jQuery中 prop() attr()使用详解
2015/05/19 Javascript
在Mac OS上安装使用Node.js的项目自动化构建工具Gulp
2016/06/18 Javascript
jQuery Easyui学习教程之实现datagrid在没有数据时显示相关提示内容
2016/07/09 Javascript
基于Bootstrap的Metronic框架实现页面链接收藏夹功能
2016/08/29 Javascript
原生js实现回复评论功能
2017/01/18 Javascript
Nodejs--post的公式详解
2017/04/29 NodeJs
es6在react中的应用代码解析
2017/11/08 Javascript
VUE 使用中踩过的坑
2018/02/08 Javascript
QQ跳转支付宝并自动领红包脚本(最新)
2018/06/22 Javascript
JavaScript设计模式之工厂模式简单实例教程
2018/07/03 Javascript
vue服务端渲染添加缓存的方法
2018/09/18 Javascript
JavaScript Blob对象原理及用法详解
2020/10/14 Javascript
[03:55]TI9战队采访——TNC Predator
2019/08/22 DOTA
简单谈谈python中的多进程
2016/11/06 Python
Python实现数据库并行读取和写入实例
2017/06/09 Python
Python使用filetype精确判断文件类型
2017/07/02 Python
Python及Django框架生成二维码的方法分析
2018/01/31 Python
在IPython中进行Python程序执行时间的测量方法
2018/11/01 Python
献爱心标语
2014/06/21 职场文书
大学毕业生推荐信
2014/07/09 职场文书
环境卫生倡议书
2014/08/29 职场文书
党员“四风”方面存在问题及整改措施
2014/09/24 职场文书
教师见习报告范文
2014/11/03 职场文书
司机个人年终总结
2015/03/03 职场文书
详解CocosCreator消息分发机制
2021/04/16 Javascript
PyQt5实现多张图片显示并滚动
2021/06/11 Python