您的位置:首页 > 其它

设计模式之代理模式,学习笔记

2016-08-21 17:09 309 查看
  不直接操作实体对象,而是借助另外一个对象来操作它,这样的话,我们可以在实体对象编写核心代码,而用代理对象来编写条件等等,如果满足就访问实体对象。这样的话当你不需要条件的时候,我们只是需要把代理对象删除,其他的都不不用去改变。简单来讲所谓的代理模式就是通过另外一个人来帮它完成一部分的任务,减轻压力。如下:


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



  总之代理模式还是很有意思的,你可以先去实现核心代码,如果项目比较赶你也可以不使用代理来访问,有时间的话去优化。

  

  其实这些说的都是一个意思,就是核心的不动,修改的只是代理类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: