摘要:要解決的問(wèn)題代理模式主要解決的問(wèn)題是將復(fù)雜的操作邏輯隱藏起來(lái),讓方法的使用者只使用幾個(gè)固定的和類方法就可以簡(jiǎn)單的實(shí)現(xiàn)一些功能。可以看出代理模式是將復(fù)雜的邏輯一步一步的封裝到每個(gè)類中,而且每個(gè)類都有自己唯一的職責(zé)。
要解決的問(wèn)題
代理模式主要解決的問(wèn)題是將復(fù)雜的操作邏輯隱藏起來(lái),讓方法的使用者只使用幾個(gè)固定的set和get類方法就可以簡(jiǎn)單的實(shí)現(xiàn)一些功能。而且代碼還不失擴(kuò)展性和維護(hù)性。
能解決的常見問(wèn)題圖片預(yù)加載
一般網(wǎng)頁(yè)上顯示圖片如果直接img標(biāo)簽中寫上src,在用戶訪問(wèn)網(wǎng)頁(yè)時(shí)可能因?yàn)榫W(wǎng)速的原因,會(huì)顯示一大片空白的區(qū)域,這樣容易引起不明真相的用戶的困惑。所以目前一般的網(wǎng)站都會(huì)有圖片預(yù)加載機(jī)制,也就是在真正的圖片在被加載完成之前用一張菊花圖(轉(zhuǎn)圈的gif圖片)表示正在加載圖片。
這是一張圖片標(biāo)題
TS代碼
/* 生成一張圖片 */ class myImg{ imgNode = document.createElement("img"); constructor(where:HTMLElement){ this.appendTo(where); }; private appendTo(where:any){ where.appendChild(this.imgNode); } setSrc( src:string ){ this.imgNode.src = src; } } /* 封裝一個(gè)類嗲用前一個(gè)類,等待網(wǎng)絡(luò)圖片加載完成之前先設(shè)置一張loading菊花圖,加載完成后將圖片換成該顯示的圖片 */ class PreloadImg extends myImg{ img = new Image; constructor( where: HTMLElement){ super(where); } setSrc(src:string){ super.setSrc("loading.gif") this.img.src = src; this.img.onload = ()=>{ super.setSrc(src); } } } /*循環(huán)調(diào)用前一個(gè)類,插入圖片的顯示列表*/ class LoadImgList extends PreloadImg{ constructor(list:string[],place:HTMLElement){ super(place); list.map((item)=>{ super.setSrc(item); }) } } /* Test */ let place = document.getElementsByTagName("div")[0]; let list = [ "圖片鏈接1", "圖片鏈接2", "圖片鏈接3", ]; new LoadImgList(list,place); //插入顯示圖片列表
可以看出上面的代碼實(shí)現(xiàn)的兩層的代理,符合單一職責(zé)的原則
1.myImg類的作用是在指定的位置插入一張圖片,并有setSrc的方法用來(lái)為圖片設(shè)置路徑。
2.PreloadImg類繼承了myImg,作用是用來(lái)在加載圖片的過(guò)程中先顯示一張占位的loading菊花圖,而在圖片加載完畢后將占位菊花圖換成加載下來(lái)的圖片。
3.LoadImgList類繼承了PreloadImg類,作用是用來(lái)將圖片隊(duì)數(shù)組中的圖片鏈接自動(dòng)的加載到圖片要插入的地方。
4.可以看出代理模式是將復(fù)雜的邏輯一步一步的封裝到每個(gè)類中,而且每個(gè)類都有自己唯一的職責(zé)。而用戶只要使用最后的LoadImgList類不用理會(huì)背后的邏輯就可以使用圖片預(yù)加載功能。同時(shí)代碼也具有可擴(kuò)展性和相對(duì)好的可維護(hù)性。
緩存計(jì)算結(jié)果
/* 用到了 單例模式 和 代理模式:用代理模式實(shí)現(xiàn)單例模式實(shí)現(xiàn)計(jì)算的緩存*/ /*負(fù)責(zé)計(jì)算相乘的結(jié)果*/ class Mult{ protected getResult(...args){ console.log("開始計(jì)算"); return args.reduce((x,y)=>{ return x*y; }); } } /*代理Mult類,緩存計(jì)算的內(nèi)容*/ class CacheMult extends Mult{ cache:object = {}; constructor(){ super(); } getResult(...args){ let sorted_args = args.sort((n1,n2)=>n1-n2); let key = sorted_args.join(",") if ( key in this.cache ){ //如果結(jié)果已經(jīng)計(jì)算過(guò)了,就返回緩存過(guò)的結(jié)果 return this.cache[key]; }else{ let result = super.getResult(...args); //調(diào)用父類得到計(jì)算結(jié)果 this.cache[ key ] = result; //緩存結(jié)果到緩存中 return result; } } } let mult = new CacheMult(); let r1 = mult.getResult(1,2,3,4); let r2 = mult.getResult(1,2,3,4); let r3 = mult.getResult(1,2,3); console.log(r1); console.log(r2); console.log(r3); /* 運(yùn)行結(jié)果 */ // 開始計(jì)算 // 開始計(jì)算 // 24 // 24 // 6
從上面的代碼中可以看出,CacheMult類代理了Mult類來(lái)事項(xiàng)緩存計(jì)算結(jié)果的功能,防止出現(xiàn)重復(fù)計(jì)算,這樣可以再某一些計(jì)算密集型的場(chǎng)景下有效的節(jié)省計(jì)算資源,提高代碼的性能。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/89959.html
摘要:虛擬代理如果需要?jiǎng)?chuàng)建一個(gè)資源消耗較大的對(duì)象,先創(chuàng)建一個(gè)消耗相對(duì)較小的對(duì)象來(lái)表示,真實(shí)對(duì)象只在需要時(shí)才會(huì)被真正創(chuàng)建。虛擬代理通過(guò)使用一個(gè)小對(duì)象來(lái)代表一個(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...
摘要:代理模式的定義來(lái)源于百度百科為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。二來(lái)源大話設(shè)計(jì)模式三例子實(shí)現(xiàn)現(xiàn)在根據(jù)上面購(gòu)票代理的場(chǎng)景來(lái)實(shí)現(xiàn)例子接口,定義真實(shí)火車站,還有代理提供的服務(wù)。一、定義? ? ? ?在網(wǎng)絡(luò)不發(fā)達(dá)之前,我們買火車票,通常都需要跑到火車站去買。這對(duì)于我們來(lái)說(shuō)可能有些麻煩,偶然有一天,你發(fā)現(xiàn)你樓下有一家便利店居然能買火車票,這就方便很多。其實(shí)啊,便利店并不提供火車服務(wù),也沒(méi)有權(quán)...
摘要:聊完了工廠模式,下面我們來(lái)說(shuō)框架中的另一個(gè)核心設(shè)計(jì)模式代理模式。這里的外賣小哥就相當(dāng)于是我們的代理。主要分為代理和代理。 聊完了工廠模式,下面我們來(lái)說(shuō)Spring框架中的另一個(gè)核心設(shè)計(jì)模式——代理模式(Proxy Pattern)。 代理模式 大家可以先不用看概念,先舉個(gè)吃飯的例子:比如說(shuō)我們想吃飯,我們可以選擇自己做飯吃、去飯店吃、叫外賣吃。如果我們選擇自己做著吃,我們就需要去買菜、...
摘要:虛擬代理虛擬代理把一些開銷很大的對(duì)象,延遲到真正需要它的時(shí)候才去創(chuàng)建。主要參考設(shè)計(jì)模式與開發(fā)實(shí)踐 設(shè)計(jì)模式 在面向?qū)ο筌浖O(shè)計(jì)過(guò)程中針對(duì)特定問(wèn)題的簡(jiǎn)潔而優(yōu)雅的解決方案。 這是在《設(shè)計(jì)模式》一書中對(duì)設(shè)計(jì)模式的定義。在軟件開發(fā)過(guò)程中,我們可能會(huì)遇到過(guò)這樣的情況,我們現(xiàn)在發(fā)現(xiàn)一個(gè)問(wèn)題,和以前的某個(gè)問(wèn)題很相似,幾乎可以用統(tǒng)一套解決方案,而且我們還發(fā)現(xiàn),在某個(gè)條件下,這個(gè)解決方案幾乎就是通用的,...
摘要:最近在讀設(shè)計(jì)模式與開發(fā)實(shí)踐,在這里把文中的各種設(shè)計(jì)模式寫出來(lái),以便加深記憶,也可以分享給初學(xué)者。經(jīng)紀(jì)人可以全權(quán)代表明星和客戶談判,最后把談判結(jié)果給明星,明星決定簽約與否。這也違反了面向?qū)ο笤O(shè)計(jì)原則中的單一職責(zé)原則。 最近在讀《javascript設(shè)計(jì)模式與開發(fā)實(shí)踐》,在這里把文中的各種設(shè)計(jì)模式寫出來(lái),以便加深記憶,也可以分享給初學(xué)者。如果你不了解設(shè)計(jì)模式,那么強(qiáng)烈推薦你閱讀一下這本書,...
摘要:什么是代理模式代理模式,類似于明星的經(jīng)紀(jì)人,想要拜訪明星,需要先通過(guò)經(jīng)紀(jì)人的溝通。不同于裝飾器,那種動(dòng)態(tài)加載一個(gè)對(duì)象,可以說(shuō)在代理模式當(dāng)中,代理是早已既定的。又稱單一功能原則,面向?qū)ο笪鍌€(gè)基本原則之一。 什么是代理模式 代理模式,類似于明星的經(jīng)紀(jì)人,想要拜訪明星,需要先通過(guò)經(jīng)紀(jì)人的溝通。而在JS當(dāng)中,如果想訪問(wèn)一個(gè)類,需要通過(guò)另一個(gè)類來(lái)間接訪問(wèn) 。不同于裝飾器,那種動(dòng)態(tài)加載一個(gè)對(duì)象,可...
閱讀 1869·2021-11-11 11:02
閱讀 1786·2021-09-22 15:55
閱讀 2599·2021-09-22 15:18
閱讀 3551·2019-08-29 11:26
閱讀 3820·2019-08-26 13:43
閱讀 2996·2019-08-26 13:32
閱讀 984·2019-08-26 10:55
閱讀 1027·2019-08-26 10:27