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 相关文章推荐
JS运行耗时操作的延时显示方法
Nov 19 Javascript
js菜单点击显示或隐藏效果的简单实例
Jan 13 Javascript
IE6 hack for js 集锦
Sep 23 Javascript
JS实现5秒钟自动封锁div层的方法
Feb 20 Javascript
jquery实现表单验证简单实例演示
Nov 23 Javascript
javascript DIV实现跟随鼠标移动
Mar 19 Javascript
jQuery Easy UI中根据第一个下拉框选中的值设置第二个下拉框是否可以编辑
Nov 29 Javascript
jQuery实现select模糊查询(反射机制)
Jan 14 Javascript
Javascript 之封装(Package)
Sep 14 Javascript
微信小程序实现的动态设置导航栏标题功能示例
Jan 31 Javascript
Vue实现固定定位图标滑动隐藏效果
May 30 Javascript
基于javascript实现日历功能原理及代码实例
May 07 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 获取本机外网/公网IP的代码
2010/05/09 PHP
PHP中几个常用的魔术常量
2012/02/23 PHP
计算php页面运行时间的函数介绍
2013/07/01 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
2014/10/16 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
jQuery toggle()设置CSS样式
2009/11/05 Javascript
jquery中dom操作和事件的实例学习 仿yahoo邮箱登录框的提示效果
2011/11/30 Javascript
javascript椭圆旋转相册实现代码
2012/01/16 Javascript
jquery 清空file域示例(兼容个浏览器)
2013/10/11 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
raphael.js绘制中国地图 地图绘制方法
2014/02/12 Javascript
JavaScript控制按钮可用或不可用的方法
2015/04/03 Javascript
jquery插件bxslider用法实例分析
2015/04/16 Javascript
jQuery选择器总结之常用元素查找方法
2016/08/04 Javascript
JS实现颜色动态淡化效果
2017/03/06 Javascript
详解angularJS动态生成的页面中ng-click无效解决办法
2017/06/19 Javascript
jQuery+css last-child实现选择最后一个子元素操作示例
2018/12/10 jQuery
深入了解响应式React Native Echarts组件
2019/05/29 Javascript
解决vue页面渲染但dom没渲染的操作
2020/07/27 Javascript
Django Admin 实现外键过滤的方法
2017/09/29 Python
Python中pandas dataframe删除一行或一列:drop函数详解
2018/07/03 Python
对python当中不在本路径的py文件的引用详解
2018/12/15 Python
利用ImageAI库只需几行python代码实现目标检测
2019/08/09 Python
Python matplotlib修改默认字体的操作
2020/03/05 Python
django 连接数据库出现1045错误的解决方式
2020/05/14 Python
python实现杨辉三角的几种方法代码实例
2021/03/02 Python
CSS3的calc()做响应模式布局的实现方法
2017/09/06 HTML / CSS
美国知名的女性服饰品牌:LOFT(洛芙特)
2016/08/05 全球购物
英国鹦鹉店:Parrot Essentials
2018/12/03 全球购物
Brasty波兰:香水、化妆品、手表网上商店
2019/04/15 全球购物
屈臣氏乌克兰:Watsons UA
2019/10/29 全球购物
项目合作意向书范本
2014/04/01 职场文书
2014年店长工作总结
2014/11/17 职场文书
MySQL创建高性能索引的全步骤
2021/05/02 MySQL
python tkinter Entry控件的焦点移动操作
2021/05/22 Python
Mysql中一千万条数据怎么快速查询
2021/12/06 MySQL