博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript 设计模式----代理模式
阅读量:3947 次
发布时间:2019-05-24

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

JavaScript 设计模式----代理模式

1. 代理模式

1.1 代理模式介绍

  • 使用者无权访问目标对象
  • 中间加代理,通过代理做授权和控制

1.2 代理模式类图

  • 传统 UML 类图
    在这里插入图片描述
  • 简化后的 UML 类图
    在这里插入图片描述

1.3 代理模式演示

class ReadImg {
constructor(fileName) {
this.fileName = fileName this.loadFromDisk() // 初始化即从硬盘中加载,模拟 } display() {
console.log('display...' + this.fileName) } loadFromDisk() {
console.log('loading...' + this.fileName) }}class ProxyImg {
constructor(fileName) {
this.realImg = new ReadImg(fileName) // 实例化 ReadImg 类 } display() {
this.realImg.display() }}// 测试let proxyImg = new ProxyImg('1.png')proxyImg.display()

1.4 代理模式场景

1.4.1 网页事件代理
1.4.2 jQuery 中 $.proxy
$('#div1').click(function () {
// this 符合期望 $(this).addClass('red') })$('#div1').click(function () {
setTimeout(function () {
// this 不符合期望 $(this).addClass('red') }, 1000)});
// 可以用如下方式解决$('#div1').click(function () {
var _this = this setTimeout(function () {
// _this 符合期望 $(_this).addClass('red'); }, 1000)});
// 但推荐使用 $.proxy 解决,这样就少定义一个变量$('#div1').click(function () {
setTimeout($.proxy(function () {
// this 符合期望 $(this).addClass('red') }, this), 1000)});
1.4.3 ES6 中 Proxy
// 明星let star = {
name: 'xxx', age: 24, phone: 'star: 13900001111'}// 经纪人let agent = new Proxy(star, {
get: function (target, key) {
// 代理的接口必须和原生的一样 if (key === 'phone') {
// 返回经纪人自己的电话 return 'agent: 16899992222' } if (key === 'price') {
// 明星不报价,经纪人报价 return 120000 } return target[key] }, set: function (target, key, val) {
if (key === 'customPrice') {
if (val < 100000) {
// 最低10w throw new Error('价格太低') } else {
target[key] = val return true } } }})// 测试console.log(agent.name);console.log(agent.age);console.log(agent.phone);console.log(agent.price);agent.customPrice = 90000console.log('agent.customPrice', agent.customPrice);

1.5 代理模式设计原则验证

  • 代理类和目标类分离,隔离开目标类和使用者
  • 符合开放封闭原则

1.6 代理模式 VS 适配器模式

  • 适配器模式
    • 提供一个不同的接口(如不同版本的插头)
    • 使用者想去使用目标类
    • 但是目标类老旧或格式不一样,不能用
    • 需要加一个第三方的适配器配置一下,进行格式的转换
    • 所以要提供一个不一样的接口
  • 代理模式
    • 提供一模一样的接口
    • 使用者无权使用目标类
    • 但是需要使用目标类的权限
    • 就需要代理,要和目标类一样的接口

1.7 代理模式 VS 装饰器模式

  • 装饰器模式
    • 扩展功能,原有功能不变且可直接使用
    • 扩展功能与原有功能并不冲突
  • 代理模式
    • 显示原有功能,但是经过限制或者阉割之后的

转载地址:http://hcqwi.baihongyu.com/

你可能感兴趣的文章
电信运营商如何进行客户细分
查看>>
c++名库介绍
查看>>
boost1.43在win7下的编译
查看>>
VC++工程如何脱离VSS环境
查看>>
转 hook 自绘原理
查看>>
NSIS 脚本介绍
查看>>
记录通讯日志的函数
查看>>
c++ 标准容器介绍与对比
查看>>
web DB优化思路
查看>>
敏捷笔记
查看>>
SOA业务理解与应用
查看>>
Google File System(中文翻译)
查看>>
Google's BigTable 原理 (翻译)
查看>>
MapReduce:超大机群上的简单数据处理
查看>>
设计模式笔记(转载)
查看>>
加站点加入IE的可信站点做法
查看>>
软件研发中的《破窗理论》
查看>>
敏捷的三种误区和五种改进
查看>>
用数字来看某知名B2C网站的发展内幕和隐私
查看>>
vs2010一些设置
查看>>