javascript设计模式 ? 代理模式原理与用法实例分析


Posted in Javascript onApril 16, 2020

本文实例讲述了javascript设计模式 ? 代理模式原理与用法。分享给大家供大家参考,具体如下:

介绍:代理使我们很常见的一众模式,proxy,nginx都称之为代理,代理是什么意思呢?代理模式在客户端和目标对象之间加入一个新的代理对象,代理对象起到一个中介作用,去掉客户不能看到的内容和服务,或者增添客户需要的额外服务。

定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式是一种对象结构型模式。

场景:我们还是以画图形为例,我将所有的绘图动作包装到Shape类中,使用代理模式来部分开放功能给客户。

示例:

var Shape = function(color){
  console.log('创建了一个对象');
  this.color = color;
  this.x;
  this.y;
  this.radius;
 
  this.setAttr = function(x, y, radius){
    this.x = x;
    this.y = y;
    this.radius = radius;
  }
  this.drawCircle = function(){
    console.log('画圆: 颜色:' + this.color + ' x:' + this.x + ' y:' + this.y + ' radius:' + this.radius)
  }
  this.drawSquare = function(){
    console.log('画方: 颜色:' + this.color + ' x:' + this.x + ' y:' + this.y )
  }
  this.drawTriangle = function(){
    console.log('画三角: 颜色:' + this.color + ' x:' + this.x + ' y:' + this.y )
  }
}
 
var proxyShape = function(color, x, y, radius){
  this.color = color;
  this.x = x;
  this.y = y;
  this.radius = radius;
  this.shape = null;
  this.drawSquare = function(){
    if(this.shape === null){
      this.shape = new Shape(this.color);
      this.shape.setAttr(this.x, this.y, this.radius);
    }
    this.shape.drawSquare();
  }
}
 
var square = new proxyShape('red', 10, 10);
square.drawSquare();
square.drawSquare();
// 创建了一个对象
// 画方: 颜色:red x:10 y:10
// 画方: 颜色:red x:10 y:10

你可以在proxyShape中增加一些日志,权限等任务。因为代理类的存在,新增的任务不会影响到Shape类。

代理模式为对象的简介访问提供了解决方案,可以对对象的访问进行控制。

代理模式总结:

优点:
* 代理模式可以协调调用者和被调用这,一定程度降低了系统耦合度。

缺点:
* 由于增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
* 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

适用场景:
* 当客户端需要访问远程主机中的对象时,可以使用远程代理。
* 当需要用一个消耗资源较少的对象来代表资源消耗较多的对象,可以使用虚拟代理
* 当需要控制一个对象的访问,为不同用户提供不同级别的访问权限时可以使用保护代理

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jQuery-1.9.1源码分析系列(十)事件系统之事件包装
Nov 20 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
May 21 Javascript
关于js原型的面试题讲解
Sep 25 Javascript
微信小程序 实例开发总结
Apr 26 Javascript
JavaScript类数组对象转换为数组对象的方法实例分析
Jul 24 Javascript
vue项目刷新当前页面的三种方法
Dec 04 Javascript
layui form表单提交之后重新加载数据表格的方法
Sep 11 Javascript
jQuery开发仿QQ版音乐播放器
Jul 10 jQuery
浅谈JavaScript中的“!!”作用
Aug 03 Javascript
javascript实现时间日期的格式化的方法汇总
Aug 06 Javascript
JavaScript代码简化技巧实例解析
Sep 09 Javascript
React服务端渲染原理解析与实践
Mar 04 Javascript
js String.prototype.trim字符去前后空格的扩展
Aug 23 #Javascript
Vue Object 的变化侦测实现代码
Apr 15 #Javascript
Vue项目vscode 安装eslint插件的方法(代码自动修复)
Apr 15 #Javascript
小程序按钮避免多次调用接口和点击方案实现(不用showLoading)
Apr 15 #Javascript
javascript设计模式 ? 享元模式原理与用法实例分析
Apr 15 #Javascript
javascript设计模式 ? 外观模式原理与用法实例分析
Apr 15 #Javascript
写给新手同学的vuex快速上手指北小结
Apr 14 #Javascript
You might like
PHP 巧用数组降低程序的时间复杂度
2010/01/01 PHP
PHP提取数据库内容中的图片地址并循环输出
2010/03/21 PHP
安装ImageMagick出现error while loading shared libraries的解决方法
2014/09/23 PHP
php使用crypt()函数进行加密
2017/06/08 PHP
php中文乱码问题的终极解决方案汇总
2017/08/01 PHP
TFDN图片播放器 不错自动播放
2006/10/03 Javascript
javascript实现上传图片前的预览(TX的面试题)
2007/08/20 Javascript
JavaScript获取网页表单action属性的方法
2015/04/02 Javascript
js实现延迟加载的方法
2015/06/24 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
2015/11/30 Javascript
jQuery获取多种input值的简单实现方法
2016/06/20 Javascript
Javascript删除指定元素节点的方法
2016/06/21 Javascript
js获取form表单所有数据的简单方法
2016/08/18 Javascript
Vue2 模板template的四种写法总结
2018/02/23 Javascript
JS实现的类似微信聊天效果示例
2019/01/29 Javascript
Webpack4 使用Babel处理ES6语法的方法示例
2019/03/07 Javascript
bootstrap tooltips在 angularJS中的使用方法
2019/04/10 Javascript
通过layer实现可输入的模态框的例子
2019/09/27 Javascript
JS document内容及样式操作完整示例
2020/01/14 Javascript
JS如何监听div的resize事件详解
2020/12/03 Javascript
JS addEventListener()和attachEvent()方法实现注册事件
2021/01/11 Javascript
详解python实现读取邮件数据并下载附件的实例
2017/08/03 Python
Php多进程实现代码
2018/05/07 Python
python 脚本生成随机 字母 + 数字密码功能
2018/05/26 Python
python中map的基本用法示例
2018/09/10 Python
python 输入一个数n,求n个数求乘或求和的实例
2018/11/13 Python
Python实现的线性回归算法示例【附csv文件下载】
2018/12/29 Python
Django models.py应用实现过程详解
2019/07/29 Python
使用Python将字符串转换为格式化的日期时间字符串
2019/09/01 Python
Django中FilePathField字段的用法
2020/05/21 Python
2014端午节活动策划方案
2014/01/27 职场文书
中专毕业生自我鉴定
2014/02/02 职场文书
小学教师个人总结
2015/02/05 职场文书
文艺委员竞选稿
2015/11/19 职场文书
导游词之云南省玉龙雪山
2019/12/19 职场文书
Java移除无效括号的方法实现
2021/08/07 Java/Android