为啥将两种模式放在一起呢?因为这样文章比较长啊。
写博客的目的我觉得首要目的是整理自己的知识点,进而优化个人所得知识体系。知识成为个人的知识,就在于能够用自己的话表达同一种意义。
本文是设计模式系列文章的第二篇文章,第一篇:。
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);
本质上,上述的发布订阅只是一个数组的增删改查。缓存下增删改查。
本文结束。