JavaScript設(shè)計(jì)模式學(xué)習(xí)之代理模式
概述
代理模式屬于設(shè)計(jì)模式中結(jié)構(gòu)型的設(shè)計(jì)模式;
定義:
顧名思義就是為一個(gè)對(duì)象提供一個(gè)代用品或占位符,以便控制對(duì)它的訪問!
白話解釋:
很多明星都是有經(jīng)紀(jì)人的,如果要聯(lián)系明顯進(jìn)行商演或者開演唱會(huì)之類的商業(yè)活動(dòng)通過是需要先跟經(jīng)紀(jì)人取得聯(lián)系的,跟經(jīng)紀(jì)人談好了合作事宜之后經(jīng)紀(jì)人再轉(zhuǎn)達(dá)給某明星,然后某明星才會(huì)去參加活動(dòng);同樣租房也是一個(gè)同樣的道理,我們不管是租房還是買房,第一反應(yīng)肯定是找鏈家這類的平臺(tái),因?yàn)槲覀冎恍枰溂疫M(jìn)行溝通,而鏈家去跟房東溝通,省去了我們直接和房東溝通的步驟;因?yàn)殒溂揖褪且粋€(gè)代理模式,它代理了這個(gè)房東的房源;
實(shí)現(xiàn)方法
舉個(gè)例子:
你作為一個(gè)追星狂魔,是某明星的忠誠粉絲;剛好某明星近期要過生日了,你準(zhǔn)備送上禮物代表你的心意,正常的流程:
var Fans = { flower(){ star.reception("花"); } } var star = { reception:function(gift){ console.log("收到粉絲的:"+gift); } } Fans.flower(); //收到粉絲的:花
你選擇了買花寄給她,希望她能感受到你的心意;但是往往理想很豐滿,現(xiàn)實(shí)很骨感!別忘了還有經(jīng)紀(jì)人,因?yàn)楹炇漳愕亩Y物的往往不是明星本人而是經(jīng)紀(jì)人:
var Fans = { flower(){ Agent.reception("花"); } } var Agent = { reception:function(gift){ console.log("粉絲送的:"+gift); //粉絲送的:花 star.reception("花"); } } var star = { reception:function(gift){ console.log("收到粉絲的:"+gift); } } Fans.flower(); //收到粉絲的:花
這里的經(jīng)紀(jì)人就是一個(gè)簡單的代理了,粉絲需要先把禮物給經(jīng)紀(jì)人,經(jīng)紀(jì)人再轉(zhuǎn)給明星本人;
保護(hù)代理
明星滿心歡喜的看到粉絲寄過來的包裹的時(shí)候,拆開一看,原來是花!明星很不屑,所以告訴經(jīng)紀(jì)人,以后凡是給我寄花的,通通不要給我了,你自己看著處理:
var Fans = { flower(){ Agent.reception("花"); } } var Agent = { reception:function(gift){ console.log("粉絲送的:"+gift); //粉絲送的:花 if(gift != "花"){ star.reception("花"); } } } var star = { reception:function(gift){ console.log("收到粉絲的:"+gift); } } Fans.flower();
上面的程序中明星根本就沒有收到粉絲寄過來的花,因?yàn)樵诮?jīng)紀(jì)人那里就已經(jīng)攔截處理了;通過經(jīng)紀(jì)人來過濾掉一部分禮物,這種模式叫做保護(hù)代理;
虛擬代理
粉絲送花明星收不到,那粉絲就轉(zhuǎn)換一下思路,送點(diǎn)錢自己去買想要的東西吧!于是找到經(jīng)紀(jì)人,給了經(jīng)紀(jì)人一百萬現(xiàn)金,讓經(jīng)紀(jì)人轉(zhuǎn)達(dá)給明星本人;
function Money(){ this.total = "一百萬現(xiàn)金" return this.total; } var Fans = { flower(){ Agent.reception(); } } var Agent = { reception:function(){ // console.log("粉絲送的:"+gift); let money = new Money(); star.reception(money.total); } } var star = { reception:function(gift){ console.log("收到粉絲的:"+gift); //收到粉絲的:一百萬現(xiàn)金 } } Fans.flower();
明星收到了一百萬就很開心;這一百萬因?yàn)椴皇腔?,沒有被經(jīng)紀(jì)人攔截過濾;所以明星本人就直接收到了,這種模式我們稱為虛擬代理模式;
虛擬代理實(shí)現(xiàn)圖片懶加載
沒用代理的時(shí)候我們的代碼是這樣的:
// 創(chuàng)建一個(gè)本體對(duì)象 var myImage = (function(){ // 創(chuàng)建標(biāo)簽 var imgNode = document.createElement( 'img' ); // 添加到頁面 document.body.appendChild( imgNode ); return { // 設(shè)置圖片的src setSrc: function( src ){ // 更改src imgNode.src = src; } } })(); myImage.setSrc( 'http:// image.qq.com/music/photo/k/000GGDys0yA0Nk.jpg' );
虛擬代理
// 創(chuàng)建一個(gè)本體對(duì)象 var myImage = (function(){ // 創(chuàng)建標(biāo)簽 var imgNode = document.createElement( 'img' ); // 添加到頁面 document.body.appendChild( imgNode ); return { // 設(shè)置圖片的src setSrc: function( src ){ // 更改src imgNode.src = src; } } })(); // 創(chuàng)建代理對(duì)象 var proxyImage = (function(){ // 創(chuàng)建一個(gè)新的img標(biāo)簽 var img = new Image; // img 加載完成事件 img.onload = function(){ // 調(diào)用 myImage 替換src方法 myImage.setSrc( this.src ); } return { // 代理設(shè)置地址 setSrc: function( src ){ // 預(yù)加載 loading myImage.setSrc( 'file:// /C:/Users/svenzeng/Desktop/loading.gif' ); // 賦值正常圖片地址 img.src = src; } } })(); proxyImage.setSrc( 'http:// image.qq.com/music/photo/k/000GGDys0yA0Nk.jpg' );
上面這段代碼運(yùn)用代理模式來實(shí)現(xiàn)圖片預(yù)加載,可以看到通過代理模式巧妙地將創(chuàng)建圖片與預(yù)加載邏輯分離,并且在未來如果不需要預(yù)加載,只要改成請(qǐng)求本體代替請(qǐng)求代理對(duì)象就行。
以上就是JavaScript設(shè)計(jì)模式學(xué)習(xí)之代理模式的詳細(xì)內(nèi)容,更多關(guān)于JavaScript設(shè)計(jì)模式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
原生js實(shí)現(xiàn)隨機(jī)點(diǎn)名
這篇文章主要為大家詳細(xì)介紹了原生js實(shí)現(xiàn)隨機(jī)點(diǎn)名,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07用戶引導(dǎo)插件driverjs的基本使用以及彈窗樣式修改方法
Driver.js是一個(gè)強(qiáng)大的、輕量級(jí)、使用原生JavaScript引擎開發(fā)的庫,用于在頁面聚焦用戶的關(guān)注點(diǎn),下面這篇文章主要介紹了用戶引導(dǎo)插件driverjs的基本使用以及彈窗樣式修改方法,需要的朋友可以參考下2024-04-04Javascript call及apply應(yīng)用場(chǎng)景及實(shí)例
這篇文章主要介紹了Javascript call及apply應(yīng)用場(chǎng)景及實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08正則表達(dá)式,替換所有HTML標(biāo)簽的簡單實(shí)例
下面小編就為大家?guī)硪黄齽t表達(dá)式,替換所有HTML標(biāo)簽的簡單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11一文帶你快速理解JavaScript中call()函數(shù)的使用
這篇文章主要為大家詳細(xì)介紹了JavaScript中call()函數(shù)的使用的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的可以參考一下2023-03-03javascript 獲取url參數(shù)和script標(biāo)簽中獲取url參數(shù)函數(shù)代碼
不要在方法中調(diào)用方法,否則可能始終獲取的是最后一個(gè)js的文件的參數(shù),要在方法中使用,請(qǐng)先用變量保存,在方法中直接獲取2010-01-01JavaScript數(shù)組及非數(shù)組對(duì)象的深淺克隆詳解原理
JavaScript中數(shù)組的方法種類眾多,在ES3-ES7不同版本時(shí)期都有新方法;并且數(shù)組的方法還有原型方法和從object繼承的方法,本文介紹了JavaScript數(shù)組及非數(shù)組對(duì)象的深淺克隆,希望讀者能從中有所收獲2021-10-10JS+DIV+CSS實(shí)現(xiàn)仿表單下拉列表效果
這篇文章主要介紹了JS+DIV+CSS實(shí)現(xiàn)仿表單下拉列表效果,涉及javascript鼠標(biāo)事件及頁面元素的動(dòng)態(tài)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08