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 相关文章推荐
js判断IE6/IE7/FF的代码[XMLHttpRequest]
Feb 16 Javascript
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
Nov 30 Javascript
php实例分享之实现显示网站运行时间
May 20 Javascript
jQuery与Ajax以及序列化
Feb 01 Javascript
Bootstrap进度条组件知识详解
May 01 Javascript
实例浅析js的this
Dec 11 Javascript
vue2.0嵌套路由实现豆瓣电影分页功能(附demo)
Mar 13 Javascript
文本溢出插件jquery.dotdotdot.js使用方法详解
Jun 22 jQuery
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
Sep 02 Javascript
vue编译打包本地查看index文件的方法
Feb 23 Javascript
Vue axios 将传递的json数据转为form data的例子
Oct 29 Javascript
Vue 样式切换及三元判断样式关联操作
Aug 09 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中使用socket方式GET、POST数据实例
2015/04/02 PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
2017/07/16 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
2021/03/09 PHP
javascript dom 基本操作小结
2010/04/11 Javascript
Prototype源码浅析 Enumerable部分(二)
2012/01/18 Javascript
Ext JS 4官方文档之三 -- 类体系概述与实践
2012/12/16 Javascript
js与css实现弹出层覆盖整个页面的方法
2014/12/13 Javascript
Bootstrap编写一个兼容主流浏览器的受众门户式风格页面
2016/07/01 Javascript
jQuery 如何实现一个滑动按钮开关
2016/12/01 Javascript
详解用webpack2搭建angular2的项目
2017/06/22 Javascript
Vue Spa切换页面时更改标题的实例代码
2017/07/15 Javascript
js实现日期显示的一些操作(实例讲解)
2017/07/27 Javascript
webpack构建react多页面应用详解
2017/09/15 Javascript
JavaScript数据结构之栈实例用法
2019/01/18 Javascript
vue移动端屏幕适配详解
2019/04/30 Javascript
Vue组件通信入门之Provide和Inject机制
2019/12/29 Javascript
vue实现购物车的监听
2020/04/20 Javascript
jquery简易手风琴插件的封装
2020/10/13 jQuery
[58:58]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第二场
2018/04/05 DOTA
分析Python编程时利用wxPython来支持多线程的方法
2015/04/07 Python
pandas中Timestamp类用法详解
2017/12/11 Python
python 实现按对象传值
2019/12/26 Python
Python‘==‘ 及 ‘is‘相关原理解析
2020/09/05 Python
python用700行代码实现http客户端
2021/01/14 Python
CSS3 创建网页动画实现弹跳球动效果
2018/10/30 HTML / CSS
员工评语大全
2014/01/19 职场文书
《长征》教学反思
2014/04/27 职场文书
珍惜资源保护环境的建议书
2014/05/14 职场文书
我与祖国共奋进演讲稿
2014/09/13 职场文书
三人合伙协议书范本
2014/10/29 职场文书
小学生毕业评语
2014/12/26 职场文书
2015年宣传部个人工作总结
2015/05/14 职场文书
2016年优秀共产党员先进事迹材料
2016/02/29 职场文书
创业计划之特色精品店
2019/08/12 职场文书
CSS实现单选折叠菜单功能
2021/11/01 HTML / CSS
mysql数据插入覆盖和时间戳的问题及解决
2022/03/25 MySQL