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实现的类flash菜单效果代码
May 17 Javascript
JavaScript中的noscript元素属性位置及作用介绍
Apr 11 Javascript
js 验证身份证信息有效性
Mar 28 Javascript
基于jQuery通过jQuery.form.js插件使用ajax提交form表单
Aug 17 Javascript
Node.js服务器环境下使用Mock.js拦截AJAX请求的教程
May 23 Javascript
get  post jsonp三种数据交互形式实例详解
Aug 25 Javascript
微信小程序之滚动视图容器的实现方法
Sep 26 Javascript
Vue CL3 配置路径别名详解
May 30 Javascript
TypeScript中使用getElementXXX()的示例代码
Sep 12 Javascript
jQuery实现form表单基于ajax无刷新提交方法实例代码
Nov 04 jQuery
解决vue-cli@3.xx安装不成功的问题及搭建ts-vue项目
Feb 09 Javascript
js实现移动端图片滑块验证功能
Sep 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
javascript,php获取函数参数对象的代码
2011/02/03 PHP
PHP 时间日期操作实战
2011/08/26 PHP
深入php socket的讲解与实例分析
2013/06/13 PHP
PHP的MVC模式实现原理分析(一相简单的MVC框架范例)
2014/04/29 PHP
php实现字符串反转输出的方法
2015/03/14 PHP
PHP经典面试题集锦
2015/03/19 PHP
yii,CI,yaf框架+smarty模板使用方法
2015/12/29 PHP
yii2实现根据时间搜索的方法
2016/05/25 PHP
nginx 设置多个站跨域
2021/03/09 Servers
一步一步教你写一个jQuery的插件教程(Plugin)
2009/09/03 Javascript
Mootools 1.2教程 输入过滤第一部分(数字)
2009/09/15 Javascript
一款jquery特效编写的大度宽屏焦点图切换特效的实例代码
2013/08/05 Javascript
JavaScript获取按钮所在form表单id的方法
2015/04/02 Javascript
javascript 中的 delete及delete运算符
2015/11/15 Javascript
实例讲解jQuery中对事件的命名空间的运用
2016/05/24 Javascript
Angular.JS学习之依赖注入$injector详析
2016/10/20 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
2017/01/19 Javascript
Node连接mysql数据库方法介绍
2017/02/07 Javascript
javascript中的面向对象
2017/03/30 Javascript
JS Testing Properties 判断属性是否在对象里的方法
2017/10/01 Javascript
vue实现select下拉显示隐藏功能
2019/09/30 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
2020/02/16 Javascript
[04:03]2014DOTA2西雅图国际邀请赛 LGD战队巡礼
2014/07/07 DOTA
python对数组进行排序,并输出排序后对应的索引值方式
2020/02/28 Python
中国领先的汽车保养服务平台:途虎养车
2019/10/18 全球购物
加拿大领先的时尚和体育零售商:Sporting Life
2019/12/15 全球购物
印度领先的眼镜电子商务网站:Lenskart
2019/12/16 全球购物
教师党员思想汇报
2014/01/06 职场文书
意向书范文
2014/03/31 职场文书
《水上飞机》教学反思
2014/04/10 职场文书
期末学生评语大全
2014/04/24 职场文书
党员干部批评与自我批评反四风思想汇报
2014/09/21 职场文书
防溺水安全教育主题班会
2015/08/12 职场文书
《云雀的心愿》教学反思
2016/02/23 职场文书
Java SSM配置文件案例详解
2021/08/30 Java/Android
Nginx静态压缩和代码压缩提高访问速度详解
2022/05/30 Servers