JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能


Posted in Javascript onFebruary 06, 2018

本文实例讲述了JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能。分享给大家供大家参考,具体如下:

单例模式

单例模式的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例

单例模式最初的定义出现于《设计模式》(艾迪生维斯理, 1994):“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”

单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。

var Singleton = (function(){
 SingletonClass() {
 }
 var singleton = null;
 return {
  getInstance: function() {
   if (singleton == null) {
  singleton = new singletonClass();
   } else {
  return singleton;
   }
  }
 }
})();
Singleton.getIntance();

前端经常用到一些和接口相关的增删改查异步操作。我们来举例,我在操作数据列表时,常常少不了,增加 修改 删除功能。有的方案是用同步的(刷新页面),用户体验好一些用异步;

代码如下

增加功能

$(".add").click(function(){
  $.ajax({
  type: "post"
    dataType:"json",
    url: "https://3water.com/",
    data: {name:"csdn博客",dir:"web前端"},
    success: function( result ){
    if ( result.status ) { alert("新增成功!") } else { alert("新增失败") }
  },
    error: function(){
    alert("新增出现异步,请得新增加或联系技术管理员");
  }
  });
});

删除功能

$(".del").click(function(){
  $.ajax({
  type: "post"
    dataType:"json",
    url: "https://3water.com/",
    data: {id:"1"},
    success: function( result ){
    if ( result.status ) { alert("删除成功!") } else { alert("删除失败") }
  },
    error: function(){
    alert("新增出现异步,请得新增加或联系技术管理员");
  }
  });
});

上面这二个代码片段简单描述了,增加和删除功能的JS代码。有的同学发现了,他们有共同点,就是ajax请求中有一部分是相同的,并且删除功能如果在其它地方也用到呢?,那在其它地方也要写一代码这种相同的代码。感觉很不舒服

我们改进一下

var SingletonCRUD = (function(){
 SingletonClass() {}
 SingletonClass.prototype = {
   constructor: SingletonClass,
   add: function( data ) {
  $.ajax({
   type: "post"
     dataType:"json",
     url: "https://3water.com/",
     data: data,
     success: function( result ){
    if ( result.status ) { alert("新增成功!") } else { alert("新增失败") }
   },
     error: function(){
    alert("新增出现异步,请得新增加或联系技术管理员");
   }
    });
   },
  remove: function( data ) {
  $.ajax({
   type: "post"
     dataType:"json",
     url: "https://3water.com/",
     data: data,
     success: function( result ){
    if ( result.status ) { alert("删除成功!") } else { alert("删除失败") }
   },
     error: function(){
    alert("新增出现异步,请得新增加或联系技术管理员");
   }
    });
   }
 }
 var singleton = null;
 return {
  getInstance: function() {
   if (singleton == null) {
  singleton = new singletonClass();
   } else {
  return singleton;
   }
  }
 }
})();
var curd = SingletonCRUD.getIntance();
$(".add").click(function(){
  var data = {"name":"name"};
  curd.add( data );
});
$(".del").click(function(){
  var data = {"id": 1};
  curd.remove( data );
});

经常用Singleton实例来做一些Tool工具类;

使用设计模式优点:解耦合、可读性强、代码结构清晰;

通过上面的小例子,把点击事件里的获取数据(click的事件函数)和操作数据(ajax请求)相分离;

通过对单例模式的优化后的代码:

var SingletonCRUD = (function(){
 SingletonClass() {}
 SingletonClass.prototype = {
   constructor: SingletonClass,
   ajax: function(url, data success ){
  $.ajax({
   type: "post"
     dataType:"json",
     url: url,
     data: data,
     success: success,
     error: function(){
    alert("新增出现异步,请得新增加或联系技术管理员");
   }
    });
   },
   add: function( data ) {
  this.ajax("https://3water.com/", data, function( result ){
    if ( result.status ) { alert("新增成功!") } else { alert("新增失败") }
  });
   },
  remove: function( data ) {
  this.ajax("https://3water.com/", data, function( result ){
    if ( result.status ) { alert("删除成功!") } else { alert("删除失败") }
  });
   }
 }
 var singleton = null;
 return {
  getInstance: function() {
   if (singleton == null) {
  singleton = new singletonClass();
   } else {
  return singleton;
   }
  }
 }
})();

SingleClass中的ajax方法,也相当于一个门面模式(Facade),隐藏内部细节,对外暴露一个接口;

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
js函数返回多个返回值的示例代码
Nov 05 Javascript
JavaScript使用replace函数替换字符串的方法
Apr 06 Javascript
JavaScript实现标题栏文字轮播效果代码
Oct 24 Javascript
基于jQuery实现自动轮播旋转木马特效
Nov 02 Javascript
实例讲解javascript注册事件处理函数
Jan 09 Javascript
基于Echarts 3.19 制作常用的图形(非静态)
May 19 Javascript
AngularJs自定义服务之实现签名和加密
Aug 02 Javascript
AngularJS实现的输入框字数限制提醒功能示例
Oct 26 Javascript
vue左侧菜单,树形图递归实现代码
Aug 24 Javascript
vue axios重复点击取消上一次请求封装的方法
Jun 19 Javascript
vue.js自定义组件实现v-model双向数据绑定的示例代码
Jan 08 Javascript
node 版本切换的实现
Feb 02 Javascript
Vue仿今日头条实例详解
Feb 06 #Javascript
electron demo项目npm install安装失败的解决方法
Feb 06 #Javascript
详解React开发必不可少的eslint配置
Feb 05 #Javascript
详解js的作用域、预解析机制
Feb 05 #Javascript
Vue使用枚举类型实现HTML下拉框步骤详解
Feb 05 #Javascript
jQuery实现动态显示select下拉列表数据的方法
Feb 05 #jQuery
详解vue静态资源打包中的坑与解决方案
Feb 05 #Javascript
You might like
解析php中const与define的应用区别
2013/06/18 PHP
phpphp图片采集后按原路径保存图片示例
2014/02/18 PHP
php中in_array函数用法探究
2014/11/25 PHP
PHP中单例模式与工厂模式详解
2017/02/17 PHP
JavaScript库 开发规则
2009/01/31 Javascript
jquery实现简单易懂的图片展示小例子
2013/11/21 Javascript
jQuery平滑旋转幻灯片特效代码分享
2015/09/07 Javascript
Bootstrap每天必学之简单入门
2015/11/19 Javascript
Web Uploader文件上传插件使用详解
2016/05/10 Javascript
基于JS快速实现导航下拉菜单动画效果附源码下载
2016/10/27 Javascript
vue2.x+webpack快速搭建前端项目框架详解
2017/11/30 Javascript
JavaScript 判断对象中是否有某属性的常用方法
2018/06/14 Javascript
ES6中的class是如何实现的(附Babel编译的ES5代码详解)
2019/05/17 Javascript
微信小程序聊天功能的示例代码
2020/01/13 Javascript
Python中逗号的三种作用实例分析
2015/06/08 Python
Python多继承原理与用法示例
2018/08/23 Python
对Python3中bytes和HexStr之间的转换详解
2018/12/04 Python
python TF-IDF算法实现文本关键词提取
2019/05/29 Python
python sklearn常用分类算法模型的调用
2019/10/16 Python
wxPython多个窗口的基本结构
2019/11/19 Python
在django中使用apscheduler 执行计划任务的实现方法
2020/02/11 Python
Java爬虫技术框架之Heritrix框架详解
2020/07/22 Python
Python读取Excel一列并计算所有对象出现次数的方法
2020/09/04 Python
HTML5 Canvas实现360度全景图的示例代码
2018/01/29 HTML / CSS
Hawes & Curtis澳大利亚官网:英国经典服饰品牌
2018/10/29 全球购物
SCDKey德国:全球领先的数字游戏市场
2019/04/09 全球购物
PHP高级工程师面试问题推荐
2013/01/18 面试题
如何用Python来进行查询和替换一个文本字符串
2014/01/02 面试题
韩国商务邀请函
2014/01/14 职场文书
投标承诺书范本
2014/03/27 职场文书
前台岗位职责
2015/02/13 职场文书
社区敬老月活动总结
2015/05/07 职场文书
门卫管理制度范本
2015/08/05 职场文书
开网店计划分析
2019/07/30 职场文书
带你学习MySQL执行计划
2021/05/31 MySQL
Python FuzzyWuzzy实现模糊匹配
2022/04/28 Python