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 相关文章推荐
很多人都是用下面的js刷新站IP和PV
Sep 05 Javascript
jQuery AjaxUpload 上传图片代码
Feb 02 Javascript
在Node.js中使用Javascript Generators详解
May 05 Javascript
微信小程序  modal详解及实例代码
Nov 09 Javascript
利用Node.js对文件进行重命名
Mar 12 Javascript
判断颜色是否合法的正则表达式(详解)
May 03 Javascript
详谈Node.js之操作文件系统
Aug 29 Javascript
基于Node.js模板引擎教程-jade速学与实战1
Sep 17 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
Aug 28 Javascript
微信小程序map组件结合高德地图API实现wx.chooseLocation功能示例
Jan 23 Javascript
vue登录以及权限验证相关的实现
Oct 25 Javascript
Vue+Bootstrap实现简易学生管理系统
Feb 09 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 利用AJAX获取网页并输出的实现代码(Zjmainstay)
2012/08/31 PHP
php合并数组中相同元素的方法
2014/11/13 PHP
Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
2016/11/10 PHP
php微信公众平台交互与接口详解
2016/11/28 PHP
php插件Xajax使用方法详解
2017/08/31 PHP
jquery 选择器部分整理
2009/10/28 Javascript
javascript 表格内容排序 简单操作示例代码
2014/01/03 Javascript
chrome下img加载对height()的影响示例探讨
2014/05/26 Javascript
跟我学习javascript创建对象(类)的8种方法
2015/11/20 Javascript
jQuery中slidedown与slideup方法用法示例
2016/09/16 Javascript
模板视图和AngularJS之间冲突的解决方法
2016/11/22 Javascript
Bootstarp基本模版学习教程
2017/02/01 Javascript
Angular使用$http.jsonp发送跨站请求的方法
2017/03/16 Javascript
Angular.JS去掉访问路径URL中的#号详解
2017/03/30 Javascript
详解webpack编译多页面vue项目的配置问题
2017/12/11 Javascript
Vue源码解析之数组变异的实现
2018/12/04 Javascript
express中static中间件的具体使用方法
2019/10/17 Javascript
Vue微信公众号网页分享的示例代码
2020/05/28 Javascript
python学习之第三方包安装方法(两种方法)
2015/07/30 Python
浅谈python中的面向对象和类的基本语法
2016/06/13 Python
python 格式化输出百分号的方法
2019/01/20 Python
Python常用模块os.path之文件及路径操作方法
2019/12/03 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
苹果中国官方网站:Apple中国
2016/07/22 全球购物
PHP两种查询函数array/row的区别
2013/06/03 面试题
工商学院毕业生个人自我评价
2013/09/19 职场文书
幼儿园小班评语大全
2014/04/17 职场文书
安全生产大检查方案
2014/05/07 职场文书
高校优秀辅导员事迹材料
2014/05/07 职场文书
学术会议通知
2015/04/15 职场文书
2016年幼儿园万圣节活动总结
2016/04/05 职场文书
导游词之介休绵山
2019/12/31 职场文书
python使用glob检索文件的操作
2021/05/20 Python
python 如何在list中找Topk的数值和索引
2021/05/20 Python
Java 泛型详解(超详细的java泛型方法解析)
2021/07/02 Java/Android