JavaScript

超轻量级php框架startmvc

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

更新时间:2020-09-08 01:18:01 作者:startmvc
本文实例讲述了js设计模式之代理模式及订阅发布模式。分享给大家供大家参考,具体如下

本文实例讲述了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>

运行结果:

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

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>

运行结果:

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

本文结束。

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

js 设计模式 代理模式 订阅发布模式