結(jié)構(gòu)型模式類型:代理模式--替別人把妹

前段時間我一個很慫的朋友說希望我給他介紹一個女朋友,簡稱songHai,我就托朋友幫忙物色了一個。那么怎么讓這個慫貨開始的時候不尬聊,那不得讓雙方有一個初步的了解。這個時候就需要代理模式。

定義

顧名思義就是幫別人做(zuo)事(mei)、解(la)決(pi)問(tiao)題,

代理模式(Proxy),為其他對象提供一種代理以控制這個對象的訪問。
首先songHai需要知道對方的名字,為了一個好印象,開局送了輛寶馬,不差錢。

// 先聲明美女對象
var girl = function (name) {
    this.name = name;
};

// 這是慫海
var songHai= function (girl) {
    this.girl = girl;
    this.sendGift= function (gift) {
        alert("Hi " + girl.name + ", 慫逼送你一個禮物:" + gift);
    }
};

// 好人是為代理
var proxyGoodMen = function (girl) {
    this.girl = girl;
    this.sendGift = function (gift) {
        (new songHai(girl)).sendGift(gift); // 替songHai送寶馬過去嘍
    }
};


在songHai 和proxyGoodMen 之間,屬性和方法是很相近的,不同的是,對象songHai因為某種原因,不方便去直接執(zhí)行sendGift,需要proxyGoodMen去代為執(zhí)行。

執(zhí)行方式

var proxy = new proxyTom(new girl("知名網(wǎng)紅小妹"));
proxy.sendGift("寶馬");

代理模式常用場景

  • 1、遠程代理,也就是為了一個對象在不同的地址空間提供局部代表,這樣可以隱藏一個對象存在于不同地址空間的事實,就像web service里的代理類一樣。

  • 2、虛擬代理,根據(jù)需要創(chuàng)建開銷很大的對象,通過它來存放實例化需要很長時間的真實對象,這樣就可以達到性能的最優(yōu)化,比如說你打開一個很大的HTML網(wǎng)頁時,里面可能有很多的文字與圖片,整個網(wǎng)頁很快就可以打開,但你此時看到的是所有的文字,圖片是一張張加載后才能看到,那些未下載的圖片替代區(qū)域就是通過虛擬代理代替了真實的圖片,

  • 3、安全代理,用來控制真實對象訪問時的權(quán)限,一般用于對象應(yīng)該有不同的訪問權(quán)限。

  • 4、智能指引 ,是指當(dāng)調(diào)用真實的對象時,代理處理另外一些事。

代理模式其實就是在訪問對象時引入一定程度的間接性,因為這種間接性,可以附加多種用途。

用虛擬代理實現(xiàn)圖片loading

看下面一段代碼

var myImage = (function(){
    var imgNode = document.createElement("img");
    imgNode.alt='imgNode'
    document.body.appendChild(imgNode);
    return {
        setSrc: function(src){
            imgNode.src = src;
            console.log('1')
        } 
    }
}());

var proxyImage = (function(){
    /**用來檢測圖片地址變化的對象img,并不會添加到界面中,只當(dāng)做為與
    被代理圖片有相同src屬性的對象。
    **/
    var img = new Image();
    img.onload = function(){
        console.log('4')
        myImage.setSrc( this.src );
        console.log('5')
    }
    return {
    setSrc: function(src){
        console.log('2')
        myImage.setSrc( "loading.gif" );
        console.log('3')
        img.src = src;
    }
  }
})();

proxyImage.setSrc("load.jpg");

打印出的結(jié)果:

1
3
/**img.src = src  修改img 屬性,圖片加載完畢后觸發(fā)img.onload函數(shù)**/
4
1
5

proxyImage對象首先調(diào)用了myImage.setSrc方法,加載一個加載速度快或者常用緩存好的圖片,將將要加載的圖片src賦值給 img對象,通過img.onload監(jiān)測將要加載圖片是否加載完成,然后再次調(diào)用myImage.setSrc方法。

es6中的proxy

在支持 Proxy 的瀏覽器環(huán)境中,Proxy是一個全局對象,可以直接使用。 Proxy(target, handler)是一個構(gòu)造函數(shù), target是被代理的對象 handlde是聲明了各類代理操作的對象,最終返回一個代理對象。外界每次通過代理對象訪問 target對象的屬性時,就會經(jīng)過 handler對象,從這個流程來看,代理對象很類似 middleware(中間件)。那么 Proxy 可以攔截什么操作呢?最常見的就是 get(讀?。?/code>、 set(修改)對象屬性等操作,完整操作。

總結(jié):

當(dāng)你想用代理模式時,你可能會想要:

  • 攔截或控制訪問一個對象
  • 簡化模糊的規(guī)則或輔助邏輯方法/類的復(fù)雜性
  • 沒有驗證/準(zhǔn)備之前,防止重-資源動作。

待完成,其他應(yīng)用代碼未補充,反正沒人看.gif

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情,實現(xiàn)同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 8,130評論 2 17
  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,799評論 11 349
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,410評論 6 13
  • 一個階段的暫停,暫停了工作、家庭、摯友,剩下自己去交替他人口中的生活。 清晨起床。洗澡。煎蛋。做一小碗噴香貓飯。放...
    鯉煜閱讀 315評論 0 0

友情鏈接更多精彩內(nèi)容