国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

從“圖片預加載”認識代理設計模式

開發 前端
當我們需要獲取某個對象的方法或屬性的時候,由于權限等限制無法獲取,然后通過一個有權限的代理對象轉發我們的獲取請求,代理對象可對請求預處理,同時在返回結果的時候也可以做處理。

[[415276]]

本文轉載自微信公眾號「DYBOY」,作者DYBOY。轉載本文請聯系DYBOY公眾號。

在現代前端優化中,圖片預加載是一種常見的優化方法,預加載的背后是設計模式中代理模式的應用。

代理模式是為一個對象提供一個代用品或占位符,以便控制對該對象的訪問。

當我們需要獲取某個對象的方法或屬性的時候,由于權限等限制無法獲取,然后通過一個有權限的代理對象轉發我們的獲取請求,代理對象可對請求預處理,同時在返回結果的時候也可以做處理。

生活中的例子:代購、網絡代理、老板秘書等

一、代理模式分類

代理模式細分有:

  • 虛擬代理:將開銷大的對象延遲到需要時才創建
  • 緩存代理:為開銷大的運算結果提供緩存
  • 保護代理:用于對象應該有不同訪問權限的情況
  • 防火墻代理:控制網絡資源的訪問,保護主機不被入侵
  • 遠程代理:為一個對象在不同的地址控件提供局部代表
  • 智能引用代理:取代了簡單的指針,在訪問對象執行一些附加操作,比如計算一個對象的引用次數
  • 寫時復制代理:通常用于復制一個龐大對象的情況,延遲對象復制過程,當對象需要真正修改時才進行復制操作

保護代理的主要用途就是權限控制了,但是在 JavaScript 中并不容易實現保護代理,因為無法判斷訪問對象的來源。

而在 JavaScript 中常用有虛擬代理和緩存代理。

二、虛擬代理實現圖片預加載

在例如一些多圖的購物網站(淘寶、京東等),都使用了圖片預加載的技術。如果直接給 img 標簽設置 src 的值,由于圖片資源過大或者用戶網絡環境不佳,就會出現一個長時間白屏,以及圖片至上而下的分段加載的情況,用戶體驗不好,因此,常見的做法是用一張 Loading 小圖占位,等待實際需要加載的圖片加載完成后,再將 Loading 小圖替換成實際的圖片。

比如一個下載圖片,并將 img 標簽 append 到 HTML 中,同時提供 setSrc(src) 方法用于設置圖片資源鏈接方法的“本體對象”實現如下:

  1. var MyImage = (function() { 
  2.   var imgNode = document.createElement('img'); 
  3.   document.body.appendChild(imgNode); 
  4.  
  5.   return { 
  6.     setSrc: function(src) { 
  7.       imgNode.src = src; 
  8.     } 
  9.   } 
  10. })(); 

使用:

  1. MyImage.setSrc('http://p1.qhimg.com/bdr/__85/t0156672fda5bb4b5d3.jpg'

在弱網環境下的效果:

弱網圖片下載體驗效果

有個長時間的白屏,用戶體驗不太友好,為此引入一個 ProxyImage 代理對象,通過該代理對象,在圖片真正被加載完成之前,頁面中顯示一個 loading 動圖來提示用戶圖片正在加載中

  1. var ProxyImage = (function() { 
  2.   var img = new Image(); 
  3.   img.onload = function() { 
  4.     MyImage.setSrc(this.src); 
  5.   } 
  6.   return { 
  7.     setSrc: function(src) { 
  8.       MyImage.setSrc('./loading.gif'); 
  9.       img.src = src; 
  10.     } 
  11.   } 
  12. })(); 

使用方法:

  1. ProxyImage.setSrc('http://p1.qhimg.com/bdr/__85/t0156672fda5bb4b5d3.jpg'); 

效果:

[[415278]]

預加載下的體驗效果

可以看到我們在沒有修改原有的 MyImage 對象,通過代理對象 ProxyImage 給其增加了預加載的能力。

實際上,我們可以不用代理就能實現預加載圖片,為什么還要這么做吶?在對象設計的原則中有個“單一職責原則”。如果一個對象承擔了多項職責,那么對象就會變得較大,引起它變化的原因就可能有多個,那么職責的耦合度就比較高,會導致脆弱和低內聚的設計,當變化發生時,設計可能會遭到意外的破壞。

單一職責原則值得是,一個類應該僅有一個引起它變化的原因。職責被定義為“引起變化的原因”。

上述的做法,MyImage 僅用于添加設置 img 節點,ProxyImage 賦予了 MyImage 預加載的能力,并且對于 MyImage 對象不會有任何侵入性的修改,符合開放封閉原則。如果有一天網絡足夠快了,我們只需要改為請求本體而不是代理對象即可。不過要實現這種低成本改造,還得保證“代理和本體接口的一致性”。

保證代理和本地的一致性有如下好處:

  • 用戶可以放心地請求代理,他只關心是否能夠獲取想要的結果;
  • 在任何使用本體的地方都可以替換成代理。

三、緩存代理節省計算開銷

緩存代理為一些開銷大的運算結果提供臨時存儲,類比于“查表法”。在之前講《從閉包和高階函數初探JS設計模式》中有講到“緩存計算”概念,主要是借助“閉包”來實現臨時存儲。

首先是一個基本的乘積函數:

  1. var mult = function () { 
  2.   var a = 1; 
  3.   for(var i =0; i< arguments.length; i++) { 
  4.     a = a * arguments[i]; 
  5.   } 
  6.   return a; 
  7.  
  8. mult(1,2,3) // 6 

我們都知道乘法的計算開銷比較大,如果涉及到頻繁密集型的計算,那么對于計算機的計算性能要求就比較高,那么思考是否可以用存儲換時間?因此想到了將計算過的算式緩存,下次再遇到直接獲取值的方式,同樣考慮到職責單一設計原則,所以我們可以創建一個緩存代理函數:

  1. const ProxyMult = (function () { 
  2.   const cache = {}; 
  3.   return function () { 
  4.     const args = [].join.call(arguments, ','); 
  5.     if (args in cache) { 
  6.       return cache[args]; 
  7.     } 
  8.     let sum = 1; 
  9.     for (let i = 0; i < arguments.length; i++) { 
  10.       sum = sum * arguments[i]; 
  11.     } 
  12.     return cache[args] = sum
  13.   } 
  14. })(); 
  15.  
  16. ProxyMult(1, 2, 3, 4); 

這樣我們就為乘積函數提供了緩存能力,下次遇到相同算式,就可以不通過計算,類似查表方式拿到計算結果,再一定程度上提升了計算性能。

同理,Ajax 請求是一個耗時的 IO 操作,比如我們獲取用戶 uid=1 的信息需要 Ajax 請求一次,在一定時間內,當下一次再獲取 uid=1 用戶的信息的時候,我們沒必要再去請求一次,因為用戶的基礎信息并不是頻繁更新的,此時我們可以通過緩存方式拿到上一次獲取到的用戶信息,節省網絡帶寬資源,降低網絡異常帶來出錯的可能性。

在一些場景下我們可以嘗試自行封裝 Ajax 請求,可自行維護緩存策略。

四、總結

代理模式的應用場景像是一種賦能,保證代理和本體接口一致性的情況下,比如給圖片加載增加“預加載”能力,給乘法計算增加“緩存”能力。

“青出于藍而勝于藍”似乎是一個不錯的解釋。

 

責任編輯:武曉燕 來源: DYBOY
相關推薦

2011-03-17 10:37:07

JavaScript

2021-06-29 08:54:23

設計模式代理模式遠程代理

2012-01-13 15:59:07

2012-02-29 09:41:14

JavaScript

2010-07-05 16:07:15

UML圖設計模式

2010-03-25 08:52:30

PHP設計模式代理模式

2022-11-30 17:05:33

代碼程序場景

2024-02-26 11:52:38

代理模式設計

2011-11-24 21:03:10

ibmdw

2022-01-04 16:50:47

JavaScript圖片網站

2021-04-19 21:25:48

設計模式到元

2022-09-07 08:25:08

代理模式設計模式代碼

2021-03-10 08:20:54

設計模式OkHttp

2024-04-16 00:07:36

設計模式代理模式替身

2021-09-08 07:18:30

代理模式對象

2011-04-06 11:41:25

Java動態代理

2013-06-07 11:31:36

面向對象設計模式

2024-06-17 08:26:23

性能ViewPager頁面

2022-12-26 08:54:02

Go設計模式接口,

2011-03-23 10:40:51

java代理模式
點贊
收藏

51CTO技術棧公眾號

1区不卡电影| 中文字幕在线观看不卡| 欧美18—20岁hd第一次| 日韩欧美在线1卡| 精品久久久亚洲| 成人三级视频在线播放| 亚洲免费观看高清完整版在线观看 | 国产美女精品在线| 在线免费av电影| 亚洲mm色国产网站| 国产欧美精品一区二区三区四区| 美国成人av| 8x拔播拔播x8国产精品| 国产成人综合网| 在线免费av导航| 国产又爽又黄的激情精品视频| 久久久精品天堂| 亚洲精品国产九九九| 日产精品久久久一区二区| 亚洲成人精品一区| 97精品97| 亚洲视频在线a| 欧美尺度大的性做爰视频| 91美女精品福利| 在线毛片观看| av免费观看大全| 欧美三级电影网站| 免费人成精品欧美精品 | 国产美女高潮久久白浆| 欧美日韩亚洲视频| 三级小说欧洲区亚洲区| 一本一生久久a久久精品综合蜜 | 日日鲁鲁鲁夜夜爽爽狠狠视频97 | 日韩一级在线| 黄色aa久久| 免费看黄视频网站| 97久久精品在线| 亚洲电影一区二区| 久久久蜜桃一区二区人| 免费在线观看av电影| 性做爰过程免费播放| 欧美激情第1页| 欧美日韩在线三级| 国产一区二区在线影院| 福利视频亚洲| 高清中文字幕一区二区三区| 日韩欧美精品一区二区| 欧美国产精品日韩| 色哟哟一区二区三区| 秋霞av亚洲一区二区三| 国产精品一级在线观看| jizzjizz在线观看| 国产91色在线观看| 午夜欧美性电影| 欧美高清在线视频观看不卡| www.66久久| 综合伊思人在钱三区| 免费av不卡在线观看| 中文字幕第100页| 成人中文字幕+乱码+中文字幕| 精品丝袜一区二区三区| 欧美高清在线一区二区| 国产在线国偷精品免费看| 色婷婷亚洲mv天堂mv在影片| 国产极品久久久久久久久波多结野| 日本不卡1区2区3区| 日韩欧美亚洲日产国| 色久欧美在线视频观看| 欧美成人官网二区| 一区二区三区.www| 中文字幕一区二区在线观看| 玖玖精品视频| 欧美高清日韩| 亚洲人亚洲人色久| 日本一区福利在线| 欧美成人三级| 女子免费在线观看视频www| 天天影视色香欲综合| 霍思燕三级露全乳照| 一区二区三区视频| 成人免费在线看片| 国产精品欧美日韩久久| 国产成人在线亚洲欧美| 9.1国产丝袜在线观看| 亚洲精品福利视频| 欧美一级欧美三级| 亚洲韩国日本中文字幕| 亚洲国产一区二区三区四区| 日韩美女视频一区二区在线观看| 欧美日韩中文字幕综合视频| 91国偷自产一区二区三区成为亚洲经典| 国产激情视频一区二区三区欧美| 蜜臀av一级做a爰片久久| 蜜臀久久99精品久久久久宅男| 精品国内自产拍在线观看视频| 日韩高清二区| 国产原创一区| 91精品国产自产在线丝袜啪| 高清不卡一区| 成人福利视频| 国外成人福利视频| 色天下一区二区三区| 高清精品xnxxcom| 日韩不卡一区| 国产精品国码视频| 欧美日韩亚洲一区二区三区在线| 亚洲日本激情| 日本亚洲一区二区| 精品一区二区三区的国产在线播放| 亚洲黄色免费| 成人福利视频网站| 国产日韩欧美精品一区| 激情亚洲一区二区三区四区| 欧美在线制服丝袜| 亚洲成人中文字幕| 欧美一区二区视频观看视频| 亚洲一区在线播放| 中文字幕一区二区在线播放| 欧美日韩另类国产亚洲欧美一级| 日韩精品一区二区三区在线观看| 国产视频精品久久久| 久久这里只有精品99| av资源站久久亚洲| 日本美女爱爱视频| 中文在线观看视频| 天堂а√在线官网| 伦xxxx在线| 久久xxx视频| 亚洲美女少妇无套啪啪呻吟| 国产亚洲婷婷免费| 精品免费国产一区二区三区四区| 日韩欧美国产高清| 精品91自产拍在线观看一区| 色综合天天综合网国产成人综合天| 91精品国产综合久久香蕉的特点 | 久久电影tv| 国产精品a久久久久| 久久精品夜色噜噜亚洲aⅴ| 欧美高清精品3d| 91国内免费在线视频| 日韩中文一区二区三区| 欧美 日韩 国产一区| 婷婷激情在线| 亚洲不卡视频| 三级黄视频在线观看| 久草青青在线观看| 亚洲精品天堂成人片av在线播放 | 午夜精品久久久久久久久久久 | 视频午夜在线| 四虎5151久久欧美毛片| 99在线热播精品免费| 欧美一区二区三区视频免费| 91精品国产91久久久久久吃药| 五十路熟女丰满大屁股| 国产精品麻豆一区二区三区| 西瓜成人精品人成网站| 亚洲视频1区2区| 51久久精品夜色国产麻豆| 尤物国产精品| 欧美freesex黑人又粗又大| 免费看日本一区二区| 一区二区三区在线播放| 欧美精品中文字幕一区| 色悠悠久久综合网| 嫩草一区二区三区| 国产丝袜美腿一区二区三区| 欧美日韩国产91| www.亚洲天堂网| 九一成人免费视频| 一本色道a无线码一区v| 成人激情在线观看| 生活片a∨在线观看| 国产一区二区三区的电影| 91福利精品第一导航| 欧美激情喷水视频| 欧美aaa一级片| 欧美99久久| 在线成人免费视频| 国产乱子伦农村叉叉叉| 91麻豆精品激情在线观看最新 | 天堂va在线| 国产精品1区二区.| 欧美国产中文字幕| 麻豆av免费在线| 欧美日韩99| 在线观看不卡一区| 国产免费一区二区三区香蕉精| 久久精品影视大全| 久久精品一级| 国产一区二区三区在线观看精品| 韩国三级日本三级少妇99| 亚洲精品男人| 久久综合成人精品亚洲另类欧美| 91黄色8090| 免费av网站在线看| 99精品视频在线观看免费| 亚洲aa中文字幕| 亚洲天堂电影| 综合亚洲深深色噜噜狠狠网站| 欧美日韩精品免费看|