js设计模式之代理模式及订阅发布模式实例详解


Posted in Javascript onAugust 15, 2019

本文实例讲述了js设计模式之代理模式及订阅发布模式。分享给大家供大家参考,具体如下:

为啥将两种模式放在一起呢?因为这样文章比较长啊。

写博客的目的我觉得首要目的是整理自己的知识点,进而优化个人所得知识体系。知识成为个人的知识,就在于能够用自己的话表达同一种意义。

本文是设计模式系列文章的第二篇文章,第一篇:。

1,代理模式,只是学习了虚拟代理以及缓存代理,具体案例

1)虚拟代理

//业务代码
var myImage = (function() {
    var imgNode = document.createElement("img");
    document.body.appendChild(imgNode);
    return {
      setSrc: function(src) {
        console.log(1111);
        imgNode.src = src;
      }
    }
})();
// 设计模式代码
var ProxyImage = (function() {
    var img = new Image();
    //这个img只是用来判断图片是否加载完成,加载完成之后修改图片链接
    img.onload = function() {
      console.log(this);
      myImage.setSrc(this.src);
    };
    return {
      setSrc: function(src) {
        console.log(22);
        myImage.setSrc("http://img.lanrentuku.com/img/allimg/1212/5-121204193Q9-50.gif");
        img.src = src;
      }
    }
})();

这个例子好吧,拿来主义。说一下自己的理解:上面的业务代码实现的是将一个图片dom插入到dom树之中,代理模式则是通过创建一个新的img元素,通过判断onload判断是否加载完成,然后替换原有链接。

2)下面是缓存代理:

<script>
//缓存代理
// 计算乘法
var mult = function() {
    var a = 1;
    for (var i = 0, ilen = arguments.length; i < ilen; i += 1) {
      a = a * arguments[i];
    }
    return a;
};
// 代理函数
var proxyFunc = function(fn) {
    var cache = {}; // 缓存对象
    return function() {
      //利用闭包
      var args = Array.prototype.join.call(arguments);
      if (args in cache) {
        return cache[args]; // 使用缓存代理
      }
      return cache[args] = fn.apply(this, arguments);
    }
};
var proxyMult = proxyFunc(mult);
console.log(proxyMult(1, 2, 3, 4)); // 24
console.log(proxyMult(1, 2, 3, 4)); // 缓存取 24
</script>

运行结果:

js设计模式之代理模式及订阅发布模式实例详解

就是利用闭包实现原有计算数据的缓存。

2,订阅发布模式

<script>
var Event = (function(){
  var list = {},
     listen,
     trigger,
     remove;
     //添加订阅对象
     listen = function(key,fn){
      if(!list[key]) {
        list[key] = [];
      }
      list[key].push(fn);
    };
    //触发订阅内容
    trigger = function(){
      var key = Array.prototype.shift.call(arguments),
         fns = list[key];
      if(!fns || fns.length === 0) {
        return false;
      }
      for(var i = 0, fn; fn = fns[i++];) {
        fn.apply(this,arguments);
      }
    };
    //删除订阅内容
    remove = function(key,fn){
      var fns = list[key];
      if(!fns) {
        return false;
      }
      if(!fn) {
        fns && (fns.length = 0);
      }else {
        for(var i = fns.length - 1; i >= 0; i--){
          var _fn = fns[i];
          if(_fn === fn) {
            fns.splice(i,1);
          }
        }
      }
    };
    return {
      listen: listen,
      trigger: trigger,
      remove: remove
    }
})();
// 测试代码如下:
Event.listen("color",function(size) {
  console.log("尺码为:"+size); // 打印出尺码为42
});
Event.trigger("color",42);
</script>

运行结果:

js设计模式之代理模式及订阅发布模式实例详解

本质上,上述的发布订阅只是一个数组的增删改查。缓存下增删改查。

本文结束。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript前端代码调试运行工具:http://tools.3water.com/code/WebCodeRun测试上述代码运行效果。

更多关于JavaScript相关内容还可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
Javascript全局变量var与不var的区别深入解析
Dec 09 Javascript
基于jquery和svg实现超炫酷的动画特效
Dec 09 Javascript
jQuery实现列表的全选功能
Mar 18 Javascript
JavaScript知识点总结(六)之JavaScript判断变量数据类型
May 31 Javascript
Bootstrap CSS布局之按钮
Dec 17 Javascript
JavaScript之Date_动力节点Java学院整理
Jun 28 Javascript
vue 计时器组件的实现代码
Sep 14 Javascript
Scala解析Json字符串的实例详解
Oct 11 Javascript
webuploader实现上传图片到服务器功能
Aug 16 Javascript
浅谈Angular7 项目开发总结
Dec 19 Javascript
解决vue单页面应用进入页面加载所有 js 的问题
Aug 12 Javascript
javascript实现简易计算器功能
Sep 23 Javascript
JS实现水平遍历和嵌套递归操作示例
Aug 15 #Javascript
angularjs1.X 重构controller 的方法小结
Aug 15 #Javascript
浅析Vue中拆分视图层代码的5点建议
Aug 15 #Javascript
vue的keep-alive用法技巧
Aug 15 #Javascript
Vue开发环境中修改端口号的实现方法
Aug 15 #Javascript
Vue触发隐藏input file的方法实例详解
Aug 14 #Javascript
如何使用50行javaScript代码实现简单版的call,apply,bind
Aug 14 #Javascript
You might like
PHP 中检查或过滤IP地址的实现代码
2011/11/27 PHP
php生成数字字母的验证码图片
2015/07/14 PHP
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
2010/04/13 Javascript
基于JQUERY的多级联动代码
2012/01/24 Javascript
JS弹出层的显示与隐藏示例代码
2013/12/27 Javascript
AngularJS入门教程(零):引导程序
2014/12/06 Javascript
纯javascript响应式树形菜单效果
2015/11/10 Javascript
js中 计算两个日期间的工作日的简单实例
2016/08/08 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
2017/01/19 Javascript
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
2017/11/09 Javascript
JS实现520 表白简单代码
2018/05/21 Javascript
简单明了区分escape、encodeURI和encodeURIComponent
2018/05/26 Javascript
关于Vue项目跨平台运行问题的解决方法
2018/09/18 Javascript
vue打包之后生成一个配置文件修改接口的方法
2018/12/09 Javascript
webpack优化之代码分割与公共代码提取详解
2019/11/22 Javascript
ESLint 是如何检查 .vue 文件的
2020/11/30 Vue.js
[41:41]TFT vs Secret Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Python实现微信公众平台自定义菜单实例
2015/03/20 Python
python集合类型用法分析
2015/04/08 Python
Python线程指南详细介绍
2017/01/05 Python
详解python websocket获取实时数据的几种常见链接方式
2019/07/01 Python
使用Python自动生成HTML的方法示例
2019/08/06 Python
Sentry错误日志监控使用方法解析
2020/11/12 Python
python Protobuf定义消息类型知识点讲解
2021/03/02 Python
使用分层画布来优化HTML5渲染的教程
2015/05/08 HTML / CSS
美体小铺英国官网:The Body Shop英国
2017/01/24 全球购物
Clarins娇韵诗英国官网:来自法国的天然护肤品牌
2017/04/18 全球购物
巴黎卡诗美国官方网站:始于1964年的头发头皮护理专家
2017/07/10 全球购物
澳洲国民品牌乡村路折扣店:Country Road & Trenery Outlet
2018/04/19 全球购物
英国HYPE双肩包官网:英国本土时尚潮牌
2018/09/26 全球购物
Vans奥地利官方网站:美国原创极限运动潮牌
2018/09/30 全球购物
个人违纪检讨书
2014/09/15 职场文书
2015年公务员个人工作总结
2015/04/24 职场文书
心得体会格式及范文
2016/01/25 职场文书
Arthas排查Kubernetes中应用频繁挂掉重启异常
2022/02/28 MySQL