JavaScript設計模式學習之代理模式
概述
代理模式屬于設計模式中結構型的設計模式;
定義:
顧名思義就是為一個對象提供一個代用品或占位符,以便控制對它的訪問!
白話解釋:
很多明星都是有經(jīng)紀人的,如果要聯(lián)系明顯進行商演或者開演唱會之類的商業(yè)活動通過是需要先跟經(jīng)紀人取得聯(lián)系的,跟經(jīng)紀人談好了合作事宜之后經(jīng)紀人再轉達給某明星,然后某明星才會去參加活動;同樣租房也是一個同樣的道理,我們不管是租房還是買房,第一反應肯定是找鏈家這類的平臺,因為我們只需要跟鏈家進行溝通,而鏈家去跟房東溝通,省去了我們直接和房東溝通的步驟;因為鏈家就是一個代理模式,它代理了這個房東的房源;
實現(xiàn)方法
舉個例子:
你作為一個追星狂魔,是某明星的忠誠粉絲;剛好某明星近期要過生日了,你準備送上禮物代表你的心意,正常的流程:
var Fans = {
flower(){
star.reception("花");
}
}
var star = {
reception:function(gift){
console.log("收到粉絲的:"+gift);
}
}
Fans.flower(); //收到粉絲的:花
你選擇了買花寄給她,希望她能感受到你的心意;但是往往理想很豐滿,現(xiàn)實很骨感!別忘了還有經(jīng)紀人,因為簽收你的禮物的往往不是明星本人而是經(jīng)紀人:
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īng)紀人,經(jīng)紀人再轉給明星本人;
保護代理
明星滿心歡喜的看到粉絲寄過來的包裹的時候,拆開一看,原來是花!明星很不屑,所以告訴經(jīng)紀人,以后凡是給我寄花的,通通不要給我了,你自己看著處理:
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();
上面的程序中明星根本就沒有收到粉絲寄過來的花,因為在經(jīng)紀人那里就已經(jīng)攔截處理了;通過經(jīng)紀人來過濾掉一部分禮物,這種模式叫做保護代理;
虛擬代理
粉絲送花明星收不到,那粉絲就轉換一下思路,送點錢自己去買想要的東西吧!于是找到經(jīng)紀人,給了經(jīng)紀人一百萬現(xiàn)金,讓經(jīng)紀人轉達給明星本人;
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();
明星收到了一百萬就很開心;這一百萬因為不是花,沒有被經(jīng)紀人攔截過濾;所以明星本人就直接收到了,這種模式我們稱為虛擬代理模式;
虛擬代理實現(xiàn)圖片懶加載
沒用代理的時候我們的代碼是這樣的:
// 創(chuàng)建一個本體對象
var myImage = (function(){
// 創(chuàng)建標簽
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' );
虛擬代理
// 創(chuàng)建一個本體對象
var myImage = (function(){
// 創(chuàng)建標簽
var imgNode = document.createElement( 'img' );
// 添加到頁面
document.body.appendChild( imgNode );
return {
// 設置圖片的src
setSrc: function( src ){
// 更改src
imgNode.src = src;
}
}
})();
// 創(chuàng)建代理對象
var proxyImage = (function(){
// 創(chuàng)建一個新的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' );
上面這段代碼運用代理模式來實現(xiàn)圖片預加載,可以看到通過代理模式巧妙地將創(chuàng)建圖片與預加載邏輯分離,并且在未來如果不需要預加載,只要改成請求本體代替請求代理對象就行。
以上就是JavaScript設計模式學習之代理模式的詳細內容,更多關于JavaScript設計模式的資料請關注腳本之家其它相關文章!
相關文章
一文帶你快速理解JavaScript中call()函數(shù)的使用
這篇文章主要為大家詳細介紹了JavaScript中call()函數(shù)的使用的相關知識,文中的示例代碼講解詳細,具有一定的學習價值,需要的可以參考一下2023-03-03
javascript 獲取url參數(shù)和script標簽中獲取url參數(shù)函數(shù)代碼
不要在方法中調用方法,否則可能始終獲取的是最后一個js的文件的參數(shù),要在方法中使用,請先用變量保存,在方法中直接獲取2010-01-01
JavaScript數(shù)組及非數(shù)組對象的深淺克隆詳解原理
JavaScript中數(shù)組的方法種類眾多,在ES3-ES7不同版本時期都有新方法;并且數(shù)組的方法還有原型方法和從object繼承的方法,本文介紹了JavaScript數(shù)組及非數(shù)組對象的深淺克隆,希望讀者能從中有所收獲2021-10-10

