zoukankan      html  css  js  c++  java
  • js设计模式之代理模式以及订阅发布模式

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

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

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

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

    1)虚拟代理

     1  //业务代码
     2     var myImage = (function() {
     3         var imgNode = document.createElement("img");
     4         document.body.appendChild(imgNode);
     5         return {
     6             setSrc: function(src) {
     7                 console.log(1111);
     8                 imgNode.src = src;
     9             }
    10         }
    11     })();
    12     // 设计模式代码
    13     var ProxyImage = (function() {
    14         var img = new Image();
    15         //这个img只是用来判断图片是否加载完成,加载完成之后修改图片链接
    16         img.onload = function() {
    17             console.log(this);
    18             myImage.setSrc(this.src);
    19         };
    20         return {
    21             setSrc: function(src) {
    22                 console.log(22);
    23                 myImage.setSrc("http://img.lanrentuku.com/img/allimg/1212/5-121204193Q9-50.gif");
    24                 img.src = src;
    25             }
    26         }
    27     })();

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

    2)下面是缓存代理:

     1   //缓存代理
     2     // 计算乘法
     3     var mult = function() {
     4         var a = 1;
     5         for (var i = 0, ilen = arguments.length; i < ilen; i += 1) {
     6             a = a * arguments[i];
     7         }
     8         return a;
     9     };
    10    
    11     // 代理函数
    12     var proxyFunc = function(fn) {
    13         var cache = {}; // 缓存对象
    14         return function() {
    15             //利用闭包
    16             var args = Array.prototype.join.call(arguments);
    17             if (args in cache) {
    18                 return cache[args]; // 使用缓存代理
    19             }
    20             return cache[args] = fn.apply(this, arguments);
    21         }
    22     };
    23     var proxyMult = proxyFunc(mult);
    24     console.log(proxyMult(1, 2, 3, 4)); // 24
    25     console.log(proxyMult(1, 2, 3, 4)); // 缓存取 24

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

    2,订阅发布模式

     1 var Event = (function(){
     2     var list = {},
     3           listen,
     4           trigger,
     5           remove;
     6           //添加订阅对象
     7           listen = function(key,fn){
     8             if(!list[key]) {
     9                 list[key] = [];
    10             }
    11             list[key].push(fn);
    12         };
    13         //触发订阅内容
    14         trigger = function(){
    15             var key = Array.prototype.shift.call(arguments),
    16                  fns = list[key];
    17             if(!fns || fns.length === 0) {
    18                 return false;
    19             }
    20             for(var i = 0, fn; fn = fns[i++];) {
    21                 fn.apply(this,arguments);
    22             }
    23         };
    24         //删除订阅内容
    25         remove = function(key,fn){
    26             var fns = list[key];
    27             if(!fns) {
    28                 return false;
    29             }
    30             if(!fn) {
    31                 fns && (fns.length = 0);
    32             }else {
    33                 for(var i = fns.length - 1; i >= 0; i--){
    34                     var _fn = fns[i];
    35                     if(_fn === fn) {
    36                         fns.splice(i,1);
    37                     }
    38                 }
    39             }
    40         };
    41         return {
    42             listen: listen,
    43             trigger: trigger,
    44             remove: remove
    45         }
    46 })();
    47 // 测试代码如下:
    48 Event.listen("color",function(size) {
    49     console.log("尺码为:"+size); // 打印出尺码为42
    50 });
    51 Event.trigger("color",42);

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

    本文结束。

  • 相关阅读:
    类例程_java战斗程序
    "类"的讲稿
    象棋中“车”的攻击范围_C#
    面向对象_方法_例题
    入门例子
    MyBatis
    MyBatis
    MyBatis
    Spring
    Hibernate学习
  • 原文地址:https://www.cnblogs.com/zhensg123/p/9028423.html
Copyright © 2011-2022 走看看