博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之代理模式,学习笔记
阅读量:4327 次
发布时间:2019-06-06

本文共 1627 字,大约阅读时间需要 5 分钟。

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

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

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

  

  其实这些说的都是一个意思,就是核心的不动,修改的只是代理类。

 

转载于:https://www.cnblogs.com/pssp/p/5793065.html

你可能感兴趣的文章
迷宫实现
查看>>
【字符编码】Java字符编码详细解答及问题探讨
查看>>
学习操作系统导图
查看>>
在线的JSON formate工具
查看>>
winform非常实用的程序退出方法!!!!!(转自博客园)
查看>>
xml解析
查看>>
centos安装vim
查看>>
linux工作调度(计划任务)
查看>>
hdu--1698 Just a Hook(线段树+区间更新+懒惰标记)
查看>>
Python学习笔记-EXCEL操作
查看>>
CListCtrlEx:一个支持文件拖放和实时监视的列表控件——用未公开API函数实现Shell实时监视...
查看>>
DirectShow实现抓图(Delphi)
查看>>
PS3 可播放的多媒体类型
查看>>
游戏开发的调试机制
查看>>
js中深拷贝代码实现
查看>>
远程获得乐趣的 Linux 命令
查看>>
Celery Flower监控,完美搞定
查看>>
完美分页
查看>>
IE8/9 JQuery.Ajax 上传文件无效
查看>>
Uploadify--上传图片
查看>>