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 相关文章推荐
jquery 必填项判断表单是否为空的方法
Sep 14 Javascript
JavaScript Event学习第三章 早期的事件处理程序
Feb 07 Javascript
JS画线(实例代码)
Nov 20 Javascript
javascript弹出层输入框(示例代码)
Dec 11 Javascript
jQuery ajax serialize() 方法使用示例
Nov 02 Javascript
jQuery中outerHeight()方法用法实例
Jan 19 Javascript
js密码强度校验
Nov 10 Javascript
js编写贪吃蛇的小游戏
Aug 24 Javascript
jQuery实现本地预览上传图片功能
Jan 08 Javascript
vue router路由嵌套不显示问题的解决方法
Jun 17 Javascript
说说Vue.js中的functional函数化组件的使用
Feb 12 Javascript
Vue实现移动端拖拽交换位置
Jul 29 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 将数组打乱 shuffle函数的用法及简单实例
2016/06/17 PHP
PHP设置images目录不充许http访问的方法
2016/11/01 PHP
把JS与CSS写在同一个文件里的书写方法
2007/06/02 Javascript
javascript jQuery $.post $.ajax用法
2008/07/09 Javascript
JS getStyle获取最终样式函数代码
2010/04/01 Javascript
整理一些JavaScript的IE和火狐的兼容性注意事项
2011/03/17 Javascript
关于JS判断图片是否加载完成且获取图片宽度的方法
2013/04/09 Javascript
JQuery实现鼠标移动到图片上显示边框效果
2014/01/09 Javascript
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
javascript结合Canvas 实现简易的圆形时钟
2015/03/11 Javascript
纯js实现无限空间大小的本地存储
2015/06/18 Javascript
JavaScript实现把数字转换成中文
2015/06/29 Javascript
jquery判断输入密码两次是否相等
2020/04/22 Javascript
全面解析Bootstrap手风琴效果
2020/04/17 Javascript
JS取模、取商及取整运算方法示例
2016/10/13 Javascript
利用transition实现文字上下抖动的效果
2017/01/21 Javascript
jQuery实用密码强度检测
2017/03/02 Javascript
Vue.js中 v-model 指令的修饰符详解
2018/12/03 Javascript
关于RxJS Subject的学习笔记
2018/12/05 Javascript
微信小程序实现批量倒计时功能
2020/11/01 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
2020/07/13 Javascript
python实现在pickling的时候压缩的方法
2014/09/25 Python
python 二分查找和快速排序实例详解
2017/10/13 Python
Python OpenCV实现图片上输出中文
2018/01/22 Python
django中的HTML控件及参数传递方法
2018/03/20 Python
Python远程视频监控程序的实例代码
2019/05/05 Python
Python实现某论坛自动签到功能
2019/08/20 Python
Python封装成可带参数的EXE安装包实例
2019/08/24 Python
Python中*args和**kwargs的区别详解
2019/09/17 Python
python爬虫爬取笔趣网小说网站过程图解
2019/11/18 Python
应届毕业生的自我鉴定
2013/11/13 职场文书
揭牌仪式主持词
2014/03/19 职场文书
雷锋精神演讲稿
2014/05/13 职场文书
态度决定一切演讲稿
2014/05/20 职场文书
大学入学感言
2015/08/01 职场文书
Nginx如何获取自定义请求header头和URL参数详解
2022/07/23 Servers