设计模式之代理模式,学习笔记
不直接操作實體對象,而是借助另外一個對象來操作它,這樣的話,我們可以在實體對象編寫核心代碼,而用代理對象來編寫條件等等,如果滿足就訪問實體對象。這樣的話當你不需要條件的時候,我們只是需要把代理對象刪除,其他的都不不用去改變。簡單來講所謂的代理模式就是通過另外一個人來幫它完成一部分的任務,減輕壓力。如下:
var sayHello = function(){
console.log('Hello World');
};
var cHello = function(name){
if(name==='老王'){
sayHello();
}
};
cHello('老王'); //Hello World
cHello('老李');
sayHello是核心代碼,而cHello是代理,比如原本項目的需求是不管是訪問sayHello都執行console.log而需求有些變化,只有老王訪問的時候才執行sayHello。如果下次再改變我們只需要動代理類就行,而不需要去修改核心的類,突然發現其實這種很有好處的,比如你根本一開始就不需要去考慮代理,但項目需要更改的時候再去寫代理類,也是一樣的,哈。
?
使用代理模式的另外一個好處就是,比如頁面中我們不一定一開始就需要加載所有的JS代碼,一部分是根據一些情況才進行加載的,但我們又允許用戶提前是使用這些功能,這個時候我們就可以設計一個代理類,讓用戶來訪問這個代理類,將數據保存到代理類里面,而到需要的時候再訪問實際的類。
var sayHello = function(){
console.log('Hello World');
};
var cHello = function(){
setTimeout(function(){
sayHello();
},2000)
};
cHello(); //Hello World
多少有些像亡羊補牢的感覺,一步一步的加條件。
另外使用代理模式配合緩存機制可以極大的提高性能,比如我們可以通過代理來保存一些數據,如果這個數據已經技術過了那么我們直接返回這個數據,如果沒有計算過那么再訪問源對象進行計算。
//核心
var count = function(){
var a = 0;
for(var i=0,c;c=arguments[i++];){
a+=c; //c = arguments[i]
}
return a;
};
//代理
var fcount = (function(){
//保存緩存的數據
var obj = {};
return function(){
var arg = arguments;
var temp = Array.prototype.join.call(arg,',');
if(temp in obj){
console.log('ok');//用來測試是否有使用緩存的數據
return obj[temp];
}
return obj[temp] = count.apply(null,arg);
};
}());
console.log(fcount(2,3)); //5
console.log(fcount(2,3)); //ok 5
console.log(fcount(2,3,5));//10
console.log(fcount(2,3,5));// ok 10
總之代理模式還是很有意思的,你可以先去實現核心代碼,如果項目比較趕你也可以不使用代理來訪問,有時間的話去優化。
其實這些說的都是一個意思,就是核心的不動,修改的只是代理類。
轉發自:http://www.cnblogs.com/pssp/p/5793065.html
轉載于:https://www.cnblogs.com/smallroc/p/6596511.html
總結
以上是生活随笔為你收集整理的设计模式之代理模式,学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【笔试面试】神马搜索C++程序猿电话面试
- 下一篇: FTP的连接方式(防火墙的配置)