成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

javascript之代理模式

MAX_zuo / 529人閱讀

支持原作者,購(gòu)買地址鏈接描述

概念

代理模式
代理模式(Proxy),為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。
在現(xiàn)實(shí)生活中,可以找到很多代理模式使用的場(chǎng)景。明星都有經(jīng)紀(jì)人作為代理。如果請(qǐng)明星來(lái)演出,就要先同他的經(jīng)紀(jì)人溝通,談好相應(yīng)的細(xì)節(jié)與報(bào)酬。再交給明星。
需求:公司(Company)通過(guò)經(jīng)紀(jì)人(agent)找明星(start)開(kāi)演唱會(huì)

//演唱會(huì)
var Concert = function(){}
//公司
var Company = {
    askforconcert: function(target){
       var concert = new Concert();
       target.openconcert(concert )
    }

}
//明星
var star = {
    openconcert: function(concert){
         console.log("明星同意開(kāi)一場(chǎng)演唱會(huì)")
    }
}
//經(jīng)紀(jì)人代理
var agent = {
    openconcert: function(concert){
        star.openconcert(concert)
    }
}
//執(zhí)行
Company.askforconcert(agent);  //=>明星同意開(kāi)一場(chǎng)演唱會(huì)

這樣 company直接把請(qǐng)求發(fā)給agent,agent再轉(zhuǎn)給star,這樣就完成了一個(gè)簡(jiǎn)單的代理模式
(compan=>agent=>star)

保護(hù)代理和虛擬代理
經(jīng)濟(jì)人可以幫助 明星過(guò)濾掉一些請(qǐng)求,比如 錢不夠多或者場(chǎng)地不夠好,這種請(qǐng)求可以直接在經(jīng)紀(jì)人出被過(guò)濾拒絕掉。這種代理就叫做保護(hù)代理。 
由經(jīng)紀(jì)人Agent來(lái)控制對(duì)明星star的訪問(wèn)。

- 如果A 通過(guò) B 送花給C,我們可以在A的時(shí)候new 一個(gè) flower傳遞給代理B,再由B決定什么時(shí)候或者是否要再轉(zhuǎn)交個(gè)最終的target C。new Flower這個(gè)操作可以交給B,B決定可以送花給C的時(shí)候再由B做 new Flower的操作。這種模式就叫做虛擬代理。虛擬代理把一些開(kāi)銷很大的對(duì)象,延遲到真正需要它的時(shí)候才去創(chuàng)建
var Flower = function(){
    this.price = 150
}
var a = {
  sendflower: function(target){
        var flower = new Flower()
        target.receiveFlower(flower )
    }
}
var b = {
    receiveFlower: function(flower){
        if(flower.price < 100){
          console.log("太便宜了,女神表示一臉嫌棄")
          return false
        }else{
            c.receiveFlower(flower)
        }
    },
    
        
}
var c = {
    receiveFlower: function(){
        console.log("接受了鮮花")
    }
}
實(shí)現(xiàn)圖片預(yù)加載

不是用代理設(shè)計(jì)模式的實(shí)現(xiàn)

var  preLoadImage = (function(){
    var imgNode = document.createElement("img");
    document.body.append(imgNode)
    var img = new Image();
    img.onload = function(){
      imgNode.src = img.src
    }
    return {
        setSrc: function(src){
            imgNode.src = "loading.gif";
            img.src = src;
        }
    }
})()  

使用代理模式的實(shí)現(xiàn)方式

var image = (function(){
    var imgNode = document.createElement("img");
    document.body.append(imgNode);
    return {
        setSrc: function(src){
            imgNode.src = src;
        }
    }
})()
//代理
var proxyImage = (function(){
    var img = new Image();
    img.onload = function(){
        image.setSrc = img.src;
    }
    return {
        setSrc: function(src){
            image.setSrc = "loading.gif";
            img.src = src;
        }
    }
})

單一職責(zé)原則
單一職責(zé)指的是,對(duì)一個(gè)類而言,應(yīng)該僅有一個(gè)引起他變化的原因。如果一個(gè)對(duì)象承擔(dān)了多個(gè)原則,就意味著這個(gè)對(duì)象將變得巨大,引起他變化的原因可能也會(huì)有多個(gè)。面向?qū)ο笤O(shè)計(jì)鼓勵(lì)將行為分不到細(xì)粒度的對(duì)象之中,如果一個(gè)對(duì)象承擔(dān)的職責(zé)過(guò)多,等于把這些值得耦合到了一起,這種耦合會(huì)導(dǎo)致脆弱和低內(nèi)聚的設(shè)計(jì)。當(dāng)變化發(fā)生時(shí),設(shè)計(jì)可能會(huì)遭到意外的破壞。(書(shū)中93頁(yè))

preLoadImage方法,承擔(dān)了添加img標(biāo)簽,還有預(yù)加載兩個(gè)功能,代碼耦合到了一起,當(dāng)我修改添加標(biāo)簽時(shí),可能會(huì)影響到另一部分功能。

而用代理方法重構(gòu)后,image方法只負(fù)責(zé)創(chuàng)建標(biāo)簽,設(shè)置src,預(yù)加載功能交給了proxyImage,解除了耦合的代碼,兩個(gè)功能互不干擾。

虛擬代理合并http請(qǐng)求

(page95)

var syncFile = function(id){
    $.ajax({
        data: {
            id: id
        }
    })...
}
//綁定事件
for(var i = 0;i

這里有個(gè)很嚴(yán)重的問(wèn)題,每點(diǎn)一個(gè)都會(huì)發(fā)送一個(gè)ajax請(qǐng)求,性能上,這是一個(gè)很大的開(kāi)銷

需求: 文件同步穿,選中的文件會(huì)被上傳到服務(wù)器上,解決方法,我們可以 通過(guò)一個(gè)代理函數(shù),來(lái)收集一段時(shí)間內(nèi)的請(qǐng)求,將請(qǐng)求的參數(shù)緩存起來(lái),與后端人員協(xié)商將選中的id作為一個(gè)數(shù)組傳到后臺(tái)保存。

var syncFile = function(ids){
    $.ajax({
        data: {
            id: ids
        }
    })...
}

var proxyFile = (function(){
    var cache = [],
        timer = null;

    return function(id){
        cache.push(id);
        if(timer){
            return
        }
        timer = setTimeout(function(){
            syncFile(cache.join(","))
            clearTimeout(timer);
            timer = null;
            cache = [];
        },2000)
    }
})()
//綁定事件
for(var i = 0;i

這樣,有選中操作的話,不會(huì)頻繁觸發(fā)請(qǐng)求。

緩存代理

緩存代理可以作為一些開(kāi)銷大的運(yùn)算結(jié)果提供暫時(shí)的存儲(chǔ),下次運(yùn)算時(shí),如果傳遞進(jìn)來(lái)的參數(shù)跟之前一致,則可以直接返回前面存儲(chǔ)的運(yùn)算結(jié)果

//demo
var mult = function(){
    console.log("開(kāi)始計(jì)算結(jié)果")
    var a  = 1;
    for(var i = 0;i

return cache[args] = mult.apply(this,arguments),這里遇見(jiàn)個(gè)認(rèn)知上的問(wèn)題,一直在想,這里的this指針是指向window對(duì)象的,而mult函數(shù),也在window對(duì)象下。思路卡住,沒(méi)想明白為什么要用apply指一下指針,想了一下,原來(lái)是為了把這個(gè)參數(shù)apply進(jìn)去。。。我真他媽的智障。參數(shù)是不能從 把代理里的arguments直接mult(arguments) 過(guò)去的。

實(shí)際中

積分商城項(xiàng)目的購(gòu)物車之前由于趕工,請(qǐng)求處理的很粗糙,可以使用代理模式重新重構(gòu)代碼。

將請(qǐng)求合并緩存做處理。

重構(gòu)之后 會(huì)補(bǔ)充文章。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91113.html

相關(guān)文章

  • Javascript設(shè)計(jì)模式——代理模式

    摘要:最近在讀設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐,在這里把文中的各種設(shè)計(jì)模式寫(xiě)出來(lái),以便加深記憶,也可以分享給初學(xué)者。經(jīng)紀(jì)人可以全權(quán)代表明星和客戶談判,最后把談判結(jié)果給明星,明星決定簽約與否。這也違反了面向?qū)ο笤O(shè)計(jì)原則中的單一職責(zé)原則。 最近在讀《javascript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》,在這里把文中的各種設(shè)計(jì)模式寫(xiě)出來(lái),以便加深記憶,也可以分享給初學(xué)者。如果你不了解設(shè)計(jì)模式,那么強(qiáng)烈推薦你閱讀一下這本書(shū),...

    cuieney 評(píng)論0 收藏0
  • 100行代碼讓您學(xué)會(huì)JavaScript原生的Proxy設(shè)計(jì)模式

    摘要:面向?qū)ο笤O(shè)計(jì)里的設(shè)計(jì)模式之代理模式,相信很多朋友已經(jīng)很熟悉了。代表當(dāng)前執(zhí)行方法的實(shí)例,即方法調(diào)用者。代表具體的方法名稱。現(xiàn)在我們?cè)俅握{(diào)用,傳入構(gòu)造器返回的代理對(duì)象打印輸出,代理邏輯生效了和的一樣優(yōu)雅地實(shí)現(xiàn)了代理設(shè)計(jì)模式。 showImg(https://segmentfault.com/img/remote/1460000016760603);面向?qū)ο笤O(shè)計(jì)里的設(shè)計(jì)模式之Proxy(代理...

    txgcwm 評(píng)論0 收藏0
  • javascript設(shè)計(jì)模式學(xué)習(xí)筆記代理模式

    摘要:代理模式代理模式是為一個(gè)對(duì)象提供一個(gè)代用品或者占位符以便控制對(duì)它的訪問(wèn)引入代理模式,其實(shí)是為了實(shí)現(xiàn)單一職責(zé)的面向?qū)ο笤O(shè)計(jì)原則。 代理模式 代理模式是為一個(gè)對(duì)象提供一個(gè)代用品或者占位符, 以便控制對(duì)它的訪問(wèn) 引入代理模式,其實(shí)是為了實(shí)現(xiàn)單一職責(zé)的面向?qū)ο笤O(shè)計(jì)原則。 虛擬代理 將一些開(kāi)銷很大的對(duì)象, 延遲到正真需要的時(shí)候執(zhí)行 // 針對(duì)大圖 增加loading圖 ...

    big_cat 評(píng)論0 收藏0
  • 細(xì)談JavaScript中的一些設(shè)計(jì)模式

    摘要:注意事項(xiàng)聲明函數(shù)時(shí)候處理業(yè)務(wù)邏輯區(qū)分和單例的區(qū)別,配合單例實(shí)現(xiàn)初始化構(gòu)造函數(shù)大寫(xiě)字母開(kāi)頭推薦注意的成本。簡(jiǎn)單工廠模式使用一個(gè)類通常為單體來(lái)生成實(shí)例。 @(書(shū)籍閱讀)[JavaScript, 設(shè)計(jì)模式] 常見(jiàn)設(shè)計(jì)模式 一直對(duì)設(shè)計(jì)模式不太懂,花了一下午加一晚上的時(shí)間,好好的看了看各種設(shè)計(jì)模式,并總結(jié)了一下。 設(shè)計(jì)模式簡(jiǎn)介 設(shè)計(jì)模式概念解讀 設(shè)計(jì)模式的發(fā)展與在JavaScript中的應(yīng)用 ...

    30e8336b8229 評(píng)論0 收藏0
  • JavaScript設(shè)計(jì)模式結(jié)構(gòu)型設(shè)計(jì)模式

    摘要:享元模式通過(guò)分析應(yīng)用程序的對(duì)象,將其解析為內(nèi)在數(shù)據(jù)和外在數(shù)據(jù),減少對(duì)象數(shù)量,從而提高程序的性能。通過(guò)這種方式進(jìn)行事件綁定,可以減少事件處理程序的數(shù)量,這種方式叫做事件委托,也是運(yùn)用了享元模式的原理。事件處理程序是公用的內(nèi)在部分,每個(gè)菜單項(xiàng)各 github 全文地址 : YOU-SHOULD-KNOW-JS JavaScript設(shè)計(jì)模式之外觀模式 概念 外觀模式:為一組復(fù)雜子系統(tǒng)接口提...

    xiaoqibTn 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<