代理模式屬於設計模式中結構型的設計模式;
設計模式
定義:app
顧名思義就是爲一個對象提供一個代用品或佔位符,以便控制對它的訪問!this
白話解釋:spa
不少明星都是有經紀人的,若是要聯繫明顯進行商演或者開演唱會之類的商業活動經過是須要先跟經紀人取得聯繫的,跟經紀人談好了合做事宜以後經紀人再轉達給某明星,而後某明星纔會去參加活動;一樣租房也是一個一樣的道理,咱們無論是租房仍是買房,第一反應確定是找鏈家這類的平臺,由於咱們只須要跟鏈家進行溝通,而鏈家去跟房東溝通,省去了咱們直接和房東溝通的步驟;由於鏈家就是一個代理模式,它代理了這個房東的房源;
設計
舉個例子:代理
你做爲一個追星狂魔,是某明星的忠誠粉絲;恰好某明星近期要過生日了,你準備送上禮物表明你的心意,正常的流程:code
var Fans = { flower(){ star.reception("花"); } } var star = { reception:function(gift){ console.log("收到粉絲的:"+gift); } } Fans.flower(); //收到粉絲的:花
你選擇了買花寄給她,但願她能感覺到你的心意;可是每每理想很豐滿,現實很骨感!別忘了還有經紀人,由於簽收你的禮物的每每不是明星本人而是經紀人:對象
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(); //收到粉絲的:花
這裏的經紀人就是一個簡單的代理了,粉絲須要先把禮物給經紀人,經紀人再轉給明星本人;blog
保護代理:事件
明星滿心歡喜的看到粉絲寄過來的包裹的時候,拆開一看,原來是花!明星很不屑,因此告訴經紀人,之後凡是給我寄花的,統統不要給我了,你本身看着處理:
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();
上面的程序中明星根本就沒有收到粉絲寄過來的花,由於在經紀人那裏就已經攔截處理了;經過經紀人來過濾掉一部分禮物,這種模式叫作保護代理;
虛擬代理:
粉絲送花明星收不到,那粉絲就轉換一下思路,送點錢本身去買想要的東西吧!因而找到經紀人,給了經紀人一百萬現金,讓經紀人轉達給明星本人;
function Money(){ this.total = "一百萬現金" 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); //收到粉絲的:一百萬現金 } } Fans.flower();
明星收到了一百萬就很開心;這一百萬由於不是花,沒有被經紀人攔截過濾;因此明星本人就直接收到了,這種模式咱們稱爲虛擬代理模式;
虛擬代理實現圖片懶加載:
沒用代理的時候咱們的代碼是這樣的:
// 建立一個本體對象 var myImage = (function(){ // 建立標籤 var imgNode = document.createElement( 'img' ); // 添加到頁面 document.body.appendChild( imgNode ); return { // 設置圖片的src setSrc: function( src ){ // 更改src imgNode.src = src; } } })(); myImage.setSrc( 'http:// image.qq.com/music/photo/k/000GGDys0yA0Nk.jpg' );
虛擬代理:
// 建立一個本體對象 var myImage = (function(){ // 建立標籤 var imgNode = document.createElement( 'img' ); // 添加到頁面 document.body.appendChild( imgNode ); return { // 設置圖片的src setSrc: function( src ){ // 更改src imgNode.src = src; } } })(); // 建立代理對象 var proxyImage = (function(){ // 建立一個新的img標籤 var img = new Image; // img 加載完成事件 img.onload = function(){ // 調用 myImage 替換src方法 myImage.setSrc( this.src ); } return { // 代理設置地址 setSrc: function( src ){ // 預加載 loading myImage.setSrc( 'file:// /C:/Users/svenzeng/Desktop/loading.gif' ); // 賦值正常圖片地址 img.src = src; } } })(); proxyImage.setSrc( 'http:// image.qq.com/music/photo/k/000GGDys0yA0Nk.jpg' );
上面這段代碼運用代理模式來實現圖片預加載,能夠看到經過代理模式巧妙地將建立圖片與預加載邏輯分離,而且在將來若是不須要預加載,只要改爲請求本體代替請求代理對象就行。