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 相关文章推荐
IE的事件传递-event.cancelBubble示例介绍
Jan 12 Javascript
JS获取及设置TextArea或input文本框选择文本位置的方法
Mar 24 Javascript
JavaScript中的this,call,apply使用及区别详解
Jan 29 Javascript
JavaScript代码因逗号不规范导致IE不兼容的问题
Feb 25 Javascript
js实现数组冒泡排序、快速排序原理
Mar 08 Javascript
JavaScript代码里的判断小结
Aug 22 Javascript
javascript数组遍历的方法实例分析
Sep 13 Javascript
使用JavaScript中的lodash编写双色球效果
Jun 24 Javascript
微信小程序适配iphoneX的实现方法
Sep 18 Javascript
koa+mongoose实现简单增删改查接口的示例代码
May 13 Javascript
Vue router安装及使用方法解析
Dec 02 Vue.js
JS轻量级函数式编程实现XDM三
Jun 16 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通过baihui网API实现读取word文档并展示
2015/06/22 PHP
javascript动画效果类封装代码
2007/08/28 Javascript
js 分栏效果实现代码
2009/08/29 Javascript
JavaScript 大数据相加的问题
2011/08/03 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
javascript获取隐藏元素(display:none)的高度和宽度的方法
2014/06/06 Javascript
JavaScript-RegExp对象只能使用一次问题解决方法
2014/06/23 Javascript
JavaScript实现数字数组按照倒序排列的方法
2015/04/06 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
Vue.js第三天学习笔记(计算属性computed)
2016/12/01 Javascript
jquery ajaxfileupload异步上传插件使用详解
2017/02/08 Javascript
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
JS实现的tab切换选项卡效果示例
2017/02/28 Javascript
layui表格实现代码
2017/05/20 Javascript
解决Vue编译时写在style中的路径问题
2017/09/21 Javascript
在vue中根据光标的显示与消失实现下拉列表
2019/09/29 Javascript
axios如何取消重复无用的请求详解
2019/12/15 Javascript
python简单读取大文件的方法
2016/07/01 Python
Python基于分水岭算法解决走迷宫游戏示例
2017/09/26 Python
python和opencv实现抠图
2018/07/18 Python
python的pip安装以及使用教程
2018/09/18 Python
Python实现查找二叉搜索树第k大的节点功能示例
2019/01/24 Python
Python 多线程,threading模块,创建子线程的两种方式示例
2019/09/29 Python
python 如何停止一个死循环的线程
2020/11/24 Python
娇韵诗法国官网:Clarins法国
2019/01/29 全球购物
英国在线购买轮胎、预订汽车、汽车维修和装配网站:Protyre
2020/04/12 全球购物
师范毕业生个人求职信
2013/12/09 职场文书
小学生打架检讨书
2014/01/26 职场文书
应届中专生自荐书范文
2014/02/13 职场文书
2014年寒假社会实践活动心得体会
2014/04/07 职场文书
2014年流动人口工作总结
2014/11/26 职场文书
2014年科普工作总结
2014/12/06 职场文书
先进教师个人事迹材料
2014/12/15 职场文书
艺术节开幕词
2015/01/28 职场文书
食品质检员岗位职责
2015/04/08 职场文书
2015中学教学工作总结
2015/07/22 职场文书