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 相关文章推荐
类之Prototype.js学习
Jun 13 Javascript
再说AutoComplete自动补全之实现原理
Nov 05 Javascript
jQuery中parents()方法用法实例
Jan 07 Javascript
浅谈javascript 归并方法
Jan 21 Javascript
浅谈javascript原型链与继承
Jul 13 Javascript
jquery实现全选、全不选以及单选功能
Mar 23 jQuery
Angular 4.x 动态创建表单实例
Apr 25 Javascript
微信小程序动态显示项目倒计时效果
Jun 13 Javascript
vue 中动态绑定class 和 style的方法代码详解
Jun 01 Javascript
React styled-components设置组件属性的方法
Aug 07 Javascript
JS中使用react-tooltip插件实现鼠标悬浮显示框
May 15 Javascript
微信小程序开发摇一摇功能
Nov 22 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操作XML作为数据库的类
2010/12/19 PHP
php根据某字段对多维数组进行排序的方法
2015/03/07 PHP
PHP使用strtotime计算两个给定日期之间天数的方法
2015/03/18 PHP
PHP基于SimpleXML生成和解析xml的方法示例
2017/07/17 PHP
PHP中quotemeta()函数的用法讲解
2019/04/04 PHP
javascript结合ajax读取txt文件内容
2014/12/05 Javascript
jQuery实现div拖拽效果实例分析
2016/02/20 Javascript
使用jQuery的ajax方法向服务器发出get和post请求的方法
2017/01/13 Javascript
jquery拼接ajax 的json和字符串拼接的方法
2017/03/11 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
2018/09/01 Javascript
详解vue路由篇(动态路由、路由嵌套)
2019/01/27 Javascript
ES6知识点整理之数组解构和字符串解构的应用示例
2019/04/17 Javascript
js的新生代垃圾回收知识点总结
2019/08/22 Javascript
swiper Scrollbar滚动条组件详解
2019/09/08 Javascript
jquery实现弹窗(系统提示框)效果
2019/12/10 jQuery
在Vue中获取自定义属性方法:data-id的实例
2020/09/09 Javascript
Python yield 小结和实例
2014/04/25 Python
Python字典及字典基本操作方法详解
2018/01/30 Python
Python实现处理逆波兰表达式示例
2018/07/30 Python
Python BeautifulSoup [解决方法] TypeError: list indices must be integers or slices, not str
2019/08/07 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
2021/02/24 Python
CSS3 实现的加载动画
2020/12/07 HTML / CSS
小橄榄树:Le Petit Olivier
2018/04/23 全球购物
荷兰鞋类购物网站:Donelli
2019/05/24 全球购物
法国床上用品商店:La Compagnie du lit
2019/12/26 全球购物
请用用Java代码写一个堆栈
2012/01/26 面试题
关于环保的演讲稿
2014/05/10 职场文书
会展策划与管理专业求职信
2014/06/09 职场文书
中职毕业生自我鉴定范文(3篇)
2014/09/28 职场文书
对照检查剖析材料
2014/09/30 职场文书
党员专题组织生活会发言材料
2014/10/17 职场文书
政风行风建设整改方案
2014/10/27 职场文书
2015年初中生自我评价范文
2015/03/03 职场文书
用Python实现Newton插值法
2021/04/17 Python
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
2022/04/13 Python
Redis过期数据是否会被立马删除
2022/07/23 Redis