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、FireFox、Chrome等浏览器的xml处理函数js代码
Nov 30 Javascript
javascript学习笔记(十六) 系统对话框(alert、confirm、prompt)
Jun 20 Javascript
关于火狐(firefox)及ie下event获取的两种方法
Dec 27 Javascript
一波JavaScript日期判断脚本分享
Mar 06 Javascript
Bootstrap多级导航栏(级联导航)的实现代码
Mar 08 Javascript
超详细的JS弹出窗口代码大全
Apr 18 Javascript
jQuery图片加载显示loading效果
Nov 04 Javascript
jQuery插件FusionCharts实现的MSBar2D图效果示例【附demo源码】
Mar 24 jQuery
JS图片预加载插件详解
Jun 21 Javascript
JavaScript实现联动菜单特效
Jan 07 Javascript
vue中echarts图表大小适应窗口大小且不需要刷新案例
Jul 19 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
Feb 18 Vue.js
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基础学习笔记
2007/03/18 PHP
php header()函数使用说明
2008/07/10 PHP
PHP表单提交表单名称含有点号(.)则会被转化为下划线(_)
2011/12/14 PHP
php中一个有意思的日期逻辑处理
2012/03/25 PHP
深入apache host的配置详解
2013/06/09 PHP
基于empty函数的输出详解
2013/06/17 PHP
百度ping方法使用示例 自动ping百度
2014/01/26 PHP
延时重复执行函数 lLoopRun.js
2007/05/08 Javascript
js对象与打印对象分析比较
2013/04/23 Javascript
js实现按Ctrl+Enter发送效果
2014/09/18 Javascript
Javascript常用小技巧汇总
2015/06/24 Javascript
jQuery EasyUI封装简化操作
2016/09/18 Javascript
基于jQuery实现弹幕APP
2017/02/10 Javascript
js实现瀑布流效果(自动生成新的内容)
2017/03/16 Javascript
windows下vue.js开发环境搭建教程
2017/03/20 Javascript
基于jQuery选择器之表单对象属性筛选选择器的实例
2017/09/19 jQuery
vue中使用vue-router切换页面时滚动条自动滚动到顶部的方法
2017/11/28 Javascript
JavaScript比较同一天的时间大小实例代码
2018/02/09 Javascript
基于jQuery实现的设置文本区域的光标位置
2018/06/15 jQuery
JavaScript字符串转数字的5种方法及遇到的坑
2018/07/16 Javascript
JS实现判断有效的数独算法示例
2019/02/25 Javascript
ES6扩展运算符和rest运算符用法实例分析
2020/05/23 Javascript
Openlayers绘制聚合标注
2020/09/28 Javascript
python遍历一个目录,输出所有的文件名的实例
2018/04/23 Python
对numpy.append()里的axis的用法详解
2018/06/28 Python
10招!看骨灰级Pythoner玩转Python的方法
2019/04/15 Python
Django实现列表页商品数据返回教程
2020/04/03 Python
python中get和post有什么区别
2020/06/19 Python
基于selenium及python实现下拉选项定位select
2020/07/22 Python
英国高街奥特莱斯:Highstreet Outlet
2019/11/21 全球购物
Java面试题:请问一下代码输出是什么
2015/05/27 面试题
商务英语本科生的自我评价分享
2013/11/15 职场文书
教师找工作推荐信
2013/11/23 职场文书
个人批评与自我批评发言稿
2014/09/28 职场文书
毕业生个人自荐书
2015/03/05 职场文书
2015年银行客户经理工作总结
2015/04/01 职场文书