前端进阶与开发实践Web前端之路让前端飞

翻滚吧,设计模式之03代理模式笔记

2017-05-13  本文已影响9人  莫闻

代理模式

//不使用代理模式
客户--> 本体

//使用代理模式
客户-->代理-->本体
var Folwer = function(){}
var xiaoming = {
    sendFlower:function(target){
        var flower = new Flower();
        target.receiveFlower(flower);
    }
}
var A = {
    receiveFlower:function(flower){
        console.log("收到了" + flower);
    }
}

xiaoming.sendFlower(A);
var Flower = function(){};
var xiaomimg = {
    sendFlower:function(target){
        var flower = new Flower();
        target.receiverFlower( flower );
    }
}
var B = {
    receiverFlower:function(flower){
        A.receiverFlower( flower );
    }
}
var A = {
    receiverFlower:function(flower){
        console.log("收到了" + flower);
    }
}

xiaoming.sendFlower(B);

至此我们就完成了最简单的一个代理模式
那么有同学就要问了,小明自己去送和B去送,看起来不是二者没有本质区别,而且还把事情搞复杂了。
的确,此处的代理模式毫无用处,它所做的只是把请求简单地转交给本体。但不管怎样,我
们开始引入了代理,这是一个不错的起点。

var Flower = function(){};
var xiaoming = {
    sendFlower:function(target){
        var flower = new Flower();
        target.receiveFlower(flower);
    }
}
var B = {
    receiveFlower:function(flower){
        A.listenGoodMood(function(){//监听A的心情
            A.reveiveFlower(flower);
        });
    };
}
var A = {
    receiveFlower:function(flower){
        console.log("收到了" + flower);
    },
    listenGoodMood:function(fn){
        setTimeout(function(){//假设A的心情10秒后变好
            fn();
        },10000);
    }
}
xiaoming.sendFlower(B);

这个就是一个完整的代理模式的例子了。

var myImg = (function(){
    var imgEle = document.createElement("img");
    document.body.appendChild(imgEle);
    return {
        setSrc:function(src){
            imgEle.src = src;
        }
    }
})();

现在开始引入代理对象 proxyImage,通过这个代理对象,在图片被真正加载好之前,页面中
将出现一张占位的菊花图 loading.gif, 来提示用户图片正在加载。代码如下:

var proxyImage = (function(){
    var img = new Img();
    img.onload = function(){//加载完毕后,设置为需要加载的图片地址
        myImage.setSrc(this.src);
    }
    return {
        setSrc:function(src){//在刚进入页面时,先将图片地址设置为loading
            myImage.setSrc("loading.gif");
            img.src =src;//然后将src赋值给新创建的img,作为一个中转缓存点
        }
    }
})();

proxyImage.setSrc("http://www.baidu.com/img");
//现在我们通过proxyImage间接访问myImage。proxyImage控制了客户对myImage的访问,并在此过程中添加了其他额外的操作,比如在真正的图片加载好后,先调用一张loading图。

缓存代理的例子---计算乘积

var mult = function(){
    console.log("开始计算乘积");
    for(var i = 0, len = arguments.length; i < len; i++){
        a = a * arguments[i];
    }
    return a;
}

var proxyMult = (function(){
    var cache = {};//缓存
    return function(){
        var arg = Array.prototype.join.call(arguments, ",");
        if(arg in cache){
            return cache[arg];
        }
        return cache[arg] = mult.apply(this, arguments);
    }
})();

---《javascript设计模式与开发实践》

上一篇下一篇

猜你喜欢

热点阅读