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

資訊專欄INFORMATION COLUMN

設(shè)計(jì)模式之代理模式

Gilbertat / 1536人閱讀

摘要:虛擬代理虛擬代理把一些開銷很大的對(duì)象,延遲到真正需要它的時(shí)候才去創(chuàng)建。主要參考設(shè)計(jì)模式與開發(fā)實(shí)踐

設(shè)計(jì)模式

在面向?qū)ο筌浖O(shè)計(jì)過程中針對(duì)特定問題的簡(jiǎn)潔而優(yōu)雅的解決方案。

這是在《設(shè)計(jì)模式》一書中對(duì)設(shè)計(jì)模式的定義。在軟件開發(fā)過程中,我們可能會(huì)遇到過這樣的情況,我們現(xiàn)在發(fā)現(xiàn)一個(gè)問題,和以前的某個(gè)問題很相似,幾乎可以用統(tǒng)一套解決方案,而且我們還發(fā)現(xiàn),在某個(gè)條件下,這個(gè)解決方案幾乎就是通用的,于是我們決定給解決類似問題的解決方案取一個(gè)統(tǒng)一的名字,這就是設(shè)計(jì)模式。

設(shè)計(jì)模式的意義

我們都知道無論在哪個(gè)行業(yè)經(jīng)驗(yàn)都很重要,而經(jīng)驗(yàn)的意義也就在于,當(dāng)我們遇見一個(gè)以前遇見過的問題的時(shí)候,會(huì)自燃的想到以前是怎么解決的。而模式則是經(jīng)過大量的實(shí)際項(xiàng)目驗(yàn)證過的優(yōu)秀的解決方案,當(dāng)我們熟悉了模式,就可以在適當(dāng)?shù)沫h(huán)境下,條件反射式地自如地使用它們。

所有設(shè)計(jì)模式的實(shí)現(xiàn)抖遵循一條原則,即“找出程序中變化的地方,并將變化封裝起來”。一個(gè)程序的設(shè)計(jì)總是可以分為可變的部分和不可變的部分。當(dāng)我們找出可變的部分并把這些部分封裝起來,那么剩下的就是不變和穩(wěn)定的部分。這些不變和穩(wěn)定的部分是非常容易復(fù)用的。這也就是設(shè)計(jì)模式為什么描寫的是可復(fù)用面向?qū)ο筌浖A(chǔ)的原因。

當(dāng)我看到上面這段話的時(shí)候,我就決定要把設(shè)計(jì)模式要好好的學(xué)一學(xué),爛代碼到處可見,但是我們不應(yīng)該讓別人看到我們的代碼后,覺得寫的代碼是爛代碼,而上面這段話則精辟的總結(jié)了如何避免寫出爛代碼。

代理模式 簡(jiǎn)單實(shí)現(xiàn)

當(dāng)我們不能或者不想直接訪問某個(gè)對(duì)象或者方法,需要使用一個(gè)中間對(duì)象來訪問這個(gè)對(duì)象的時(shí)候,就可以稱之為代理模式。例如我們現(xiàn)在交電話費(fèi)可以直接通過支付寶來支付,不用再去跑到營(yíng)業(yè)廳支付。此時(shí),支付寶平臺(tái)實(shí)際就是一種代理,最后,它還是要把錢支付給電信公司。

var Money = function(amount) {
    this.amount = amount
};
var customer = {
    pay: function(target) {
        var money = new Money(50);
        target.receiveMoney(money.amount)
    }
}
var agent = {
    receiveMoney: function(amount) {
         mobileCompanies.receiveMoney(amount)
    }
}
var mobileCompanies = {
    receiveMoney: function(amount) {
        alert("繳費(fèi)成功,您成功繳費(fèi)"+amount+"元")
    }
} 
customer.pay(agent)  // 50
保護(hù)代理和虛擬代理 保護(hù)代理

通過中間的代理層我們可以過濾掉一些請(qǐng)求,比如可以校驗(yàn)用戶的賬戶的有效性,對(duì)于一些無效的繳費(fèi)請(qǐng)求可以直接在這里就過濾掉。這樣的代理模式稱之為保護(hù)代理,即控制對(duì)實(shí)體的訪問頻率,例如當(dāng)我們有一個(gè)接口請(qǐng)求的數(shù)據(jù)量很大,訪問量也很大的時(shí)候,可能就需要嚴(yán)格控制對(duì)這個(gè)接口的訪問,但是同時(shí)我們又不想更改這個(gè)函數(shù)的代碼,增加校驗(yàn)代碼,這時(shí)就可以通過保護(hù)代理模式。

保護(hù)代理用于控制不同權(quán)限的對(duì)象對(duì)目標(biāo)對(duì)象的訪問。

虛擬代理

虛擬代理把一些開銷很大的對(duì)象,延遲到真正需要它的時(shí)候才去創(chuàng)建。

虛擬代理實(shí)現(xiàn)圖片與加載
當(dāng)圖片過大或者網(wǎng)絡(luò)狀況不佳的情況下,圖片往往有一段時(shí)間是空白的,常用的解決方案是先用一個(gè)loaging占位,待圖片加載完成的時(shí)候再把它填充到img節(jié)點(diǎn)里面。

var imageNode = (function(){
    var imgNode = document.createElement("img")
    document.getElementById("testImg").appendChild(node)
    return {
        setSrc: function(src) {
            imgNode.src =  src
        }
    }
})()
var agent = (function(){
    vat image = new Image()
    image.onLoad = function() {
        imageNode.setSrc(this.src)
    }
    return {
        setSrc: function(src) {
            imageNode.setSrc("C:/user/test.gif")
            img.src = src
        }
    }
})()
agent.setSrc("http://test.com/test.jpg")
代理的意義

根據(jù)單一指責(zé)原則,就一個(gè)類或則方法而言,應(yīng)該僅有一個(gè)使它變化的原因。如果一個(gè)類或者方法承擔(dān)了多項(xiàng)職責(zé),不止意味著它變的很大,同時(shí)引起它變化的原因也會(huì)很多。比如上面的方法中,圖片的預(yù)加載只是一種錦上添花的效果,如果有一天我們不再需要預(yù)加載的時(shí)候,我們不需要改變imgNode對(duì)象。所以代理即隔離了變化的部分,即預(yù)加載功能,又能在適當(dāng)?shù)臅r(shí)候調(diào)用,即加載完成,當(dāng)然在代理中間還可以有很多其他的操作,正是如開頭所說的,將變化的部分封裝起來,將不變的地方抽取出來。

主要參考《JavaScript設(shè)計(jì)模式與開發(fā)實(shí)踐》

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

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

相關(guān)文章

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

    摘要:虛擬代理如果需要?jiǎng)?chuàng)建一個(gè)資源消耗較大的對(duì)象,先創(chuàng)建一個(gè)消耗相對(duì)較小的對(duì)象來表示,真實(shí)對(duì)象只在需要時(shí)才會(huì)被真正創(chuàng)建。虛擬代理通過使用一個(gè)小對(duì)象來代表一個(gè)大對(duì)象,可以減少系統(tǒng)資源的消耗,對(duì)系統(tǒng)進(jìn)行優(yōu)化并提高運(yùn)行速度。 概念 代理模式(Proxy Pattern) :一種對(duì)象結(jié)構(gòu)型模式。給某一個(gè)對(duì)象提供一個(gè)代理,并由代理對(duì)象控制對(duì)原對(duì)象的引用。 UML showImg(https://seg...

    zhisheng 評(píng)論0 收藏0
  • 設(shè)計(jì)模式代理模式

    摘要:代理模式的定義來源于百度百科為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問。二來源大話設(shè)計(jì)模式三例子實(shí)現(xiàn)現(xiàn)在根據(jù)上面購票代理的場(chǎng)景來實(shí)現(xiàn)例子接口,定義真實(shí)火車站,還有代理提供的服務(wù)。一、定義? ? ? ?在網(wǎng)絡(luò)不發(fā)達(dá)之前,我們買火車票,通常都需要跑到火車站去買。這對(duì)于我們來說可能有些麻煩,偶然有一天,你發(fā)現(xiàn)你樓下有一家便利店居然能買火車票,這就方便很多。其實(shí)啊,便利店并不提供火車服務(wù),也沒有權(quán)...

    enda 評(píng)論0 收藏0
  • Spring框架我見(二)——代理模式

    摘要:聊完了工廠模式,下面我們來說框架中的另一個(gè)核心設(shè)計(jì)模式代理模式。這里的外賣小哥就相當(dāng)于是我們的代理。主要分為代理和代理。 聊完了工廠模式,下面我們來說Spring框架中的另一個(gè)核心設(shè)計(jì)模式——代理模式(Proxy Pattern)。 代理模式 大家可以先不用看概念,先舉個(gè)吃飯的例子:比如說我們想吃飯,我們可以選擇自己做飯吃、去飯店吃、叫外賣吃。如果我們選擇自己做著吃,我們就需要去買菜、...

    oneasp 評(píng)論0 收藏0
  • Javascript設(shè)計(jì)模式——代理模式

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

    cuieney 評(píng)論0 收藏0
  • JS設(shè)計(jì)模式代理模式

    摘要:什么是代理模式代理模式,類似于明星的經(jīng)紀(jì)人,想要拜訪明星,需要先通過經(jīng)紀(jì)人的溝通。不同于裝飾器,那種動(dòng)態(tài)加載一個(gè)對(duì)象,可以說在代理模式當(dāng)中,代理是早已既定的。又稱單一功能原則,面向?qū)ο笪鍌€(gè)基本原則之一。 什么是代理模式 代理模式,類似于明星的經(jīng)紀(jì)人,想要拜訪明星,需要先通過經(jīng)紀(jì)人的溝通。而在JS當(dāng)中,如果想訪問一個(gè)類,需要通過另一個(gè)類來間接訪問 。不同于裝飾器,那種動(dòng)態(tài)加載一個(gè)對(duì)象,可...

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

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

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<