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 常用操作代码
Mar 14 Javascript
JavaScript之自定义类型
May 04 Javascript
给jQuery方法添加回调函数一款插件的应用
Jan 21 Javascript
javascript实现焦点滚动图效果 具体方法
Jun 24 Javascript
js点击更换背景颜色或图片的实例代码
Jun 25 Javascript
图片上传判断及预览脚本的效果实例
Aug 07 Javascript
将input file的选择的文件清空的两种解决方案
Oct 21 Javascript
在localStorage中存储对象数组并读取的方法
Sep 24 Javascript
Vue过滤器的用法和自定义过滤器使用
Feb 08 Javascript
ng-events类似ionic中Events的angular全局事件
Sep 05 Javascript
对angularJs中$sce服务安全显示html文本的实例
Sep 30 Javascript
JS中的算法与数据结构之字典(Dictionary)实例详解
Aug 20 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
dede全站URL静态化改造[070414更正]
2007/04/17 PHP
php读取30天之内的根据算法排序的代码
2008/04/06 PHP
PHP学习之字符串比较和查找
2011/04/17 PHP
simplehtmldom Doc api帮助文档
2012/03/26 PHP
php封装的验证码工具类完整实例
2016/10/19 PHP
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
2010/04/15 Javascript
JavaScript是如何实现继承的(六种方式)
2016/03/31 Javascript
jQuery限制图片大小的方法
2016/05/25 Javascript
JavaScript实现实时更新系统时间的实例代码
2017/04/04 Javascript
Bootstrap fileinput文件上传预览插件使用详解
2017/05/16 Javascript
关于定制FileField中的上传文件名称问题
2017/08/22 Javascript
Nodejs实现文件上传的示例代码
2017/09/26 NodeJs
JS简单实现查看文档创建日期、修改日期和文档大小的方法示例
2018/04/08 Javascript
layui当点击文本框时弹出选择框,显示选择内容的例子
2019/09/02 Javascript
JavaScript实现拖拽盒子效果
2020/02/06 Javascript
[01:42]辉夜杯战队访谈宣传片—FANTUAN
2015/12/25 DOTA
python 实现文件的递归拷贝实现代码
2012/08/02 Python
flask-socketio实现WebSocket的方法
2018/07/31 Python
实例讲解python中的协程
2018/10/08 Python
pyqt5中QThread在使用时出现重复emit的实例
2019/06/21 Python
python识别文字(基于tesseract)代码实例
2019/08/24 Python
python中seaborn包常用图形使用详解
2019/11/25 Python
Pycharm激活方法及详细教程(详细且实用)
2020/05/12 Python
基于tensorflow for循环 while循环案例
2020/06/30 Python
世界上最大的在线汽车租赁预订平台:Rentalcars.com(支持中文)
2018/10/12 全球购物
C#如何允许一个类被继承但是避免这个类的方法被重载?
2015/02/24 面试题
linux面试题参考答案(7)
2014/07/24 面试题
班级活动策划书
2014/02/06 职场文书
超市中秋节促销方案
2014/03/21 职场文书
人事经理岗位职责
2014/04/28 职场文书
党建工作经验交流材料
2014/05/25 职场文书
师德自我剖析材料范文
2014/10/06 职场文书
公司开除员工通知
2015/04/22 职场文书
创业计划书之花店
2019/09/20 职场文书
jquery插件实现代码雨特效
2021/04/24 jQuery
详解Mysql和Oracle之间的误区
2021/05/18 MySQL