搜索
首页web前端js教程代理设计模式

代理设计模式

Oct 19, 2024 pm 12:36 PM

Proxy Design Pattern

在我之前的博客中,我探索了各种处理对象创建机制的创作设计模式。现在,是时候深入研究结构设计模式,它重点关注如何组合对象和类以形成更大的结构,同时保持它们的灵活性和高效性。让我们从代理设计模式开始

JavaScript 中的代理设计模式

代理设计模式是一种结构设计模式,它提供一个对象代表另一个对象。它充当控制对真实对象的访问的中介,添加附加行为,例如延迟初始化、日志记录、访问控制或缓存,而无需更改原始对象的代码。

JavaScript 中,代理是 Proxy 对象提供的内置功能,允许您为属性访问、赋值、函数调用等基本操作定义自定义行为。

我们什么时候需要代理模式?

代理模式在以下情况下特别有用:

  • 延迟初始化:您希望延迟创建资源密集型对象,直到需要它为止。
  • 访问控制:您需要控制对对象的访问,例如限制未经授权的访问或根据条件限制操作。
  • 日志记录:您想要记录对象上的操作(例如,属性访问或方法调用)。
  • 缓存:您想要缓存昂贵操作的结果以避免冗余计算。

代理模式的组成部分

  1. 主题: 定义真实对象和代理的公共操作的接口。
  2. RealSubject: 执行实际工作的实际对象。
  3. 代理: 控制对 RealSubject 的访问的中介。

类比:

想象一下,您有一幅大画想要向客人展示,但需要花费很多时间才能从储藏室中取出它(因为它很重并且需要时间来搬运)。您决定使用这幅画的小明信片图像,在他们等待实际画作被获取时快速向他们展示,而不是每次都等待。

在这个比喻中:

  • 大画是真实的物体(就像需要时间加载的图像)。
  • 明信片是代理(一种轻量级替代品,直到真实对象准备好为止)。
  • 一旦真正的画作准备好,您就可以向客人展示实际的画作。

现实世界的类比:

将房地产经纪人视为代理人。当你想买房子时,你不会立即参观每栋房子(加载实物)。相反,房地产经纪人(代理人)首先向您展示照片和描述。只有当你准备购买时(即,当你调用display()时),代理才会安排看房(加载实物)。

真实示例:图像加载(虚拟代理)

让我们使用 Web 应用程序中的图像加载示例,我们希望延迟图像的加载,直到用户请求它(延迟加载)。代理可以充当占位符,直到加载真实图像。

以下是如何在 JavaScript 中实现代理设计模式。

示例:图像加载代理

// Step 1: The real object
class RealImage {
  constructor(filename) {
    this.filename = filename;
    this.loadImageFromDisk();
  }

  loadImageFromDisk() {
    console.log(`Loading ${this.filename} from disk...`);
  }

  display() {
    console.log(`Displaying ${this.filename}`);
  }
}

// Step 2: The proxy object
class ProxyImage {
  constructor(filename) {
    this.realImage = null; // no real image yet
    this.filename = filename;
  }

  display() {
    if (this.realImage === null) {
      // load the real image only when needed
      this.realImage = new RealImage(this.filename);
    }
    this.realImage.display(); // display the real image
  }
}

// Step 3: Using the proxy to display the image
const image = new ProxyImage("photo.jpg");
image.display(); // Loads and displays the image
image.display(); // Just displays the image (already loaded)

说明:

1)。真实图像:

  • RealImage类代表实际图像。
  • 它以文件名作为输入,并模拟从磁盘加载图像的耗时过程(由 loadImageFromDisk 方法显示)。
  • 加载后,将使用显示方法来显示图像。

2)。代理图像:

  • ProxyImage类充当RealImage的替代品。它不会立即加载真实图像。
  • 它包含对真实图像的引用(但最初它是空的,因为真实图像尚未加载)。
  • 当您在代理上调用显示方法时,它会检查真实图像是否已加载。如果没有,它会先加载,然后显示。

3)。用法:

  • 当我们创建 ProxyImage 实例时,实际图像尚未加载(因为它是资源密集型的)。
  • 第一次调用 display 时,代理加载图像(使用 RealImage 类),然后显示它。
  • 第二次调用display时,真实图片已经加载完毕,所以只显示图片,不再加载。

内置Proxy对象

ES6 代理由一个代理构造函数组成,该构造函数接受目标和处理程序作为参数

const proxy = new Proxy(target, handler)

这里,target代表应用代理的对象,而handler是一个特殊的对象,定义了代理的行为。

处理程序对象包含一系列具有预定义名称的可选方法,称为陷阱方法(例如 apply、get、set 和 has),当对代理实例执行相应操作时,这些方法会自动调用。

让我们通过使用内置代理实现计算器来理解这一点

// Step 1: The real object
class RealImage {
  constructor(filename) {
    this.filename = filename;
    this.loadImageFromDisk();
  }

  loadImageFromDisk() {
    console.log(`Loading ${this.filename} from disk...`);
  }

  display() {
    console.log(`Displaying ${this.filename}`);
  }
}

// Step 2: The proxy object
class ProxyImage {
  constructor(filename) {
    this.realImage = null; // no real image yet
    this.filename = filename;
  }

  display() {
    if (this.realImage === null) {
      // load the real image only when needed
      this.realImage = new RealImage(this.filename);
    }
    this.realImage.display(); // display the real image
  }
}

// Step 3: Using the proxy to display the image
const image = new ProxyImage("photo.jpg");
image.display(); // Loads and displays the image
image.display(); // Just displays the image (already loaded)

使用代理的最佳部分是:

  • 代理对象继承了原Calculator类的原型。
  • 通过代理设置的陷阱来避免突变。

代码说明

1)。 原型继承:

  • 代理不会干扰 **Calculator ** 类的原始原型。
  • 通过检查 proxiedCalculator.proto === Calculator.prototype 来确认这一点。结果将是true

2)。 处理 getOperations:

  • get 陷阱拦截代理对象上的属性访问。
  • 我们使用 Reflect.get 安全地访问原始对象的属性和方法。

3)。 防止突变:

每当尝试修改目标对象上的任何属性时,设置陷阱都会引发错误。这确保了不变性。

4)。 通过代理使用原型方法:

代理允许访问加、减、乘、除等方法,所有这些方法都在原始对象的原型上定义。

这里要观察的要点是:

  • 保留原型继承:代理保留对所有原型方法的访问,使其行为类似于原始计算器。
  • 防止突变: 设置陷阱可确保计算器对象的内部状态不会被意外更改。
  • 安全访问属性和方法: get 陷阱确保仅访问有效的属性,从而提高鲁棒性。

如果您已经做到了这一步,请不要忘记点赞❤️,并在下面发表评论以提出任何问题或想法。您的反馈对我来说至关重要,我很乐意收到您的来信!

以上是代理设计模式的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
JavaScript的核心:它是在C还是C上构建的?JavaScript的核心:它是在C还是C上构建的?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc; saninterpretedlanguagethatrunsonenginesoftenwritteninc.1)javascriptwasdesignedAsalightweight,解释edganguageforwebbrowsers.2)Enginesevolvedfromsimpleterterterpretpreterterterpretertestojitcompilerers,典型地提示。

JavaScript应用程序:从前端到后端JavaScript应用程序:从前端到后端May 04, 2025 am 12:12 AM

JavaScript可用于前端和后端开发。前端通过DOM操作增强用户体验,后端通过Node.js处理服务器任务。1.前端示例:改变网页文本内容。2.后端示例:创建Node.js服务器。

Python vs. JavaScript:您应该学到哪种语言?Python vs. JavaScript:您应该学到哪种语言?May 03, 2025 am 12:10 AM

选择Python还是JavaScript应基于职业发展、学习曲线和生态系统:1)职业发展:Python适合数据科学和后端开发,JavaScript适合前端和全栈开发。2)学习曲线:Python语法简洁,适合初学者;JavaScript语法灵活。3)生态系统:Python有丰富的科学计算库,JavaScript有强大的前端框架。

JavaScript框架:为现代网络开发提供动力JavaScript框架:为现代网络开发提供动力May 02, 2025 am 12:04 AM

JavaScript框架的强大之处在于简化开发、提升用户体验和应用性能。选择框架时应考虑:1.项目规模和复杂度,2.团队经验,3.生态系统和社区支持。

JavaScript,C和浏览器之间的关系JavaScript,C和浏览器之间的关系May 01, 2025 am 12:06 AM

引言我知道你可能会觉得奇怪,JavaScript、C 和浏览器之间到底有什么关系?它们之间看似毫无关联,但实际上,它们在现代网络开发中扮演着非常重要的角色。今天我们就来深入探讨一下这三者之间的紧密联系。通过这篇文章,你将了解到JavaScript如何在浏览器中运行,C 在浏览器引擎中的作用,以及它们如何共同推动网页的渲染和交互。JavaScript与浏览器的关系我们都知道,JavaScript是前端开发的核心语言,它直接在浏览器中运行,让网页变得生动有趣。你是否曾经想过,为什么JavaScr

node.js流带打字稿node.js流带打字稿Apr 30, 2025 am 08:22 AM

Node.js擅长于高效I/O,这在很大程度上要归功于流。 流媒体汇总处理数据,避免内存过载 - 大型文件,网络任务和实时应用程序的理想。将流与打字稿的类型安全结合起来创建POWE

Python vs. JavaScript:性能和效率注意事项Python vs. JavaScript:性能和效率注意事项Apr 30, 2025 am 12:08 AM

Python和JavaScript在性能和效率方面的差异主要体现在:1)Python作为解释型语言,运行速度较慢,但开发效率高,适合快速原型开发;2)JavaScript在浏览器中受限于单线程,但在Node.js中可利用多线程和异步I/O提升性能,两者在实际项目中各有优势。

JavaScript的起源:探索其实施语言JavaScript的起源:探索其实施语言Apr 29, 2025 am 12:51 AM

JavaScript起源于1995年,由布兰登·艾克创造,实现语言为C语言。1.C语言为JavaScript提供了高性能和系统级编程能力。2.JavaScript的内存管理和性能优化依赖于C语言。3.C语言的跨平台特性帮助JavaScript在不同操作系统上高效运行。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!