当前位置: 首页 > article >正文

面向对象设计模式之代理模式详解

文章目录

  • 面向对象设计模式之代理模式详解
    • 面向对象思想:现代软件开发的基石
    • 代理模式:巧妙的中间层设计
    • JavaScript 语法点与代理模式的结合
    • JavaScript 实现代理模式示例
    • 代理模式的应用场景

面向对象设计模式之代理模式详解

在现代软件开发的浩瀚领域中,面向对象思想如同基石一般,支撑起了无数复杂而精妙的软件系统。而在面向对象开发的实践过程中,人们总结出了 23 种经典的设计模式,其中代理模式凭借其独特的设计理念和广泛的应用场景,成为了开发者们不可或缺的工具。

面向对象思想:现代软件开发的基石

现代软件开始的思想便是面向对象思想,它以一种更加贴近人类思维的方式来构建软件世界。在面向对象的编程范式中,“对象” 是核心概念。对象可以理解为对现实世界中事物的抽象,每个对象都具有属性和方法。属性用于描述对象的特征,而方法则用于定义对象能够执行的操作。

对象字面量是 JavaScript 中创建对象的一种简洁方式,它不需要使用new关键字和class定义,仅仅通过{}的形式就能创建对象。例如:

const person = {name: "Alice", age: 25, sayHello: function() { console.log("Hello!"); }};

在这个例子中,nameage是属性,sayHello是方法。对象字面量的表现力极强,通过key:value的形式,能够快速地定义出具有丰富属性和行为的对象。

随着面向对象编程的发展,逐渐从单纯的面向对象编程成长为面向接口编程。接口在其中起到了至关重要的作用,它定义了一组方法签名,而不关心具体的实现细节。不同的类只要实现了相同的接口,就可以在程序中进行互换,这大大提高了软件的可扩展性和可维护性。

代理模式:巧妙的中间层设计

设计模式是开发者在长期实践中总结出来的通用解决方案,对于有 1 - 2 年经验的程序员来说,熟练掌握设计模式是提升自身技术水平的关键,也是进入大厂实习面试的重要考察内容,更是未来成长为架构师的必经之路。而代理模式,作为 23 种设计模式中的一员,有着独特的魅力。

我们可以通过一个形象的例子来理解代理模式。假设 “我(me)” 想要给心仪的人 “莎(sha)” 送花,但是直接送花可能会因为各种原因失败。这时,“小红” 作为代理对象出现了。“小红” 和 “莎” 具有一样的方法receiveFlower,“我” 可以先把花送给 “小红”,再由 “小红” 转送给 “莎”。在这个过程中,“小红” 就像是一个中间代理,代替 “我” 完成送花的操作。
从技术层面来讲,代理模式通过实现相同的接口,使得代理对象和目标对象能够进行互换,从而更好地达到目的。代理对象在客户端和目标对象之间起到中介作用,它可以在调用目标对象的方法前后,执行一些额外的操作,比如权限验证、日志记录、性能监控等。

代理模式主要有以下几种类型:

  • 静态代理:在编译期就确定了代理类和目标类,代理类和目标类实现相同的接口,代理类中持有目标类的引用,通过调用目标类的方法来实现具体功能。
  • 动态代理:在运行时动态生成代理类,相比于静态代理,它更加灵活,不需要为每个目标类都创建一个代理类。

JavaScript 语法点与代理模式的结合

JavaScript 作为一门广泛应用于前端开发的编程语言,其丰富的语法特性为实现代理模式提供了便利。

基本语法点:

const常量:使用const声明的变量一旦被赋值,就不能再重新赋值。例如:const PI = 3.14159;,PI的值将始终保持不变,这在定义一些固定的常量时非常有用。
===恒等:===用于比较两个值是否严格相等,不仅比较值,还会比较数据类型。例如1 === "1"的结果为false,因为一个是数字类型,一个是字符串类型。
数据类型:JavaScript 的数据类型包括string(字符串)、number(数字,不分int和float)、boolean(布尔值)以及object(对象,其中array数组、function函数都属于对象类型)。了解这些数据类型对于正确处理数据和编写逻辑代码至关重要。
定时器的应用
setTimeout用于在指定的毫秒数后执行一次函数,其语法为setTimeout(function(){}, 1000),表示 1000 毫秒(即 1 秒)后执行传入的函数。例如,在代理对象中,可能需要在延迟一段时间后再调用目标对象的方法,这时就可以使用setTimeout。

JavaScript 实现代理模式示例

下面通过一个简单的 JavaScript 示例来展示代理模式的实现:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body></body>
<script>
const me = {name: 'me',age: 26,location: {city: 'Philadelphia',temp: 92},isAdmin: false,sendFlower(target) {target.receiveFlower(me)}
}const sha = {name: 'sha',age: 18,xq: 50,receiveFlower(sender) {if(sha.xq < 80) {console.log('送花失败')}else {console.log('送花成功')}}
}const xh = {name: 'xiaohua',age:18,receiveFlower(sender) {// if(sender.name === 'me') {//     console.log(sender.name + "我们在一起吧!")//     return// }// sha.receiveFlower(sender)setTimeout(function() {sha.xq = 99,sha.receiveFlower(sender)},2000)}}
</script>
</html>
// 定义接口
const FlowerReceiver = {receiveFlower: function() {}
};// 目标对象
const sha = {receiveFlower: function() {console.log("莎收到了花");}
};// 代理对象
const xiaoHong = {receiveFlower: function() {console.log("小红先接收花");// 延迟1秒后调用莎的接收方法setTimeout(() => {sha.receiveFlower();}, 1000);}
};// 使用代理对象
xiaoHong.receiveFlower();

在这个示例中,FlowerReceiver定义了一个接口,sha是目标对象,实现了receiveFlower方法。xiaoHong作为代理对象,也实现了receiveFlower方法,并且在调用目标对象的方法之前,先执行了一些额外的操作(打印日志和延迟调用)。

代理模式的应用场景

代理模式在实际开发中有着广泛的应用场景:

  • 远程代理:当客户端需要访问远程服务器上的对象时,可以使用远程代理。代理对象负责处理网络通信,将客户端的请求发送到远程服务器,并将服务器的响应返回给客户端,这样客户端就不需要关心复杂的网络通信细节。
  • 虚拟代理:对于一些创建开销较大的对象,可以使用虚拟代理。在对象实际被使用之前,代理对象并不创建真实的对象,而是在需要时才进行创建,从而提高系统的性能和资源利用率。
  • 保护代理:保护代理用于控制对目标对象的访问权限。例如,在一个多用户系统中,不同用户对某些资源的访问权限不同,通过保护代理可以在调用目标对象的方法之前进行权限验证,确保只有具有相应权限的用户才能访问资源。

综上所述,代理模式作为面向对象设计模式中的重要一员,通过巧妙的中间层设计,为软件开发带来了更高的灵活性、可扩展性和可维护性。结合 JavaScript 的语法特性,我们能够更加便捷地实现代理模式,并将其应用到各种实际场景中。无论是对于初学者还是有经验的开发者,深入理解和掌握代理模式都将对提升编程能力和开发高质量软件起到重要的推动作用。

相关文章:

面向对象设计模式之代理模式详解

文章目录 面向对象设计模式之代理模式详解面向对象思想&#xff1a;现代软件开发的基石代理模式&#xff1a;巧妙的中间层设计JavaScript 语法点与代理模式的结合JavaScript 实现代理模式示例代理模式的应用场景 面向对象设计模式之代理模式详解 在现代软件开发的浩瀚领域中&a…...

C++【STL】(2)string

C【STL】string用法扩展 1. assign&#xff1a;为字符串赋新值 用于替换字符串内容&#xff0c;支持多种参数形式。 常用形式&#xff1a; // 用另一个字符串赋值 str.assign("Hello World");// 用另一个字符串的子串&#xff08;从第6个字符开始&#xff0c;取5…...

嵌入式学习笔记 - STM32 ADC,多重转换,内部参考电压,过采样,逐次逼近原理,采样时间

一 多个ADC器件&#xff0c;多重转换速率 每个型号MCU通常由多个ADC器件&#xff0c;比如STM32F4有三个ADC器件&#xff0c;每个ADC器件有一个最大转换速率&#xff0c;一般为2.4Mhz&#xff0c;即一个ADC器件每秒最多转换2.4M次&#xff0c;两次转换之间需要有时间间隔&#…...

团结引擎 1.5.0 发布,抖音小游戏平台即将开放、Shader Graph功能新增…引擎能力再提升!

「团结引擎 1.5.0」来啦&#xff01;本次技术更新的内容&#xff0c;涵盖了小游戏、团结引擎车机版、OpenHarmony、Shader Graph、Muse Chat、Hub&License、代码升级、Digital Asset Manager for Tuanjie、团结官方开源车模 Sample 几大方向。 小游戏 在 Tuanjie 1.5.0 版…...

如何下载 Microsoft SQL Server Management Studio 2019

SQL Server Management Studio 是什么,为什么你需要它 SSMS 是 Microsoft 用于管理 SQL Server 环境的主要工具。它为 Windows 用户提供了一个图形用户界面,本质上是数据库管理员和开发人员处理 SQL Server 的指挥中心。重点是——尽管你可能认为它与 SQL Server 捆绑在一起…...

【SSL部署与优化​】​​HTTP/2与HTTPS的协同效应

HTTP/2与HTTPS的协同效应&#xff1a;为何HTTP/2强制要求TLS 1.2&#xff1f; HTTP/2是HTTP协议的现代升级版&#xff0c;旨在通过多路复用、头部压缩等技术提升性能。然而&#xff0c;HTTP/2的设计与部署与HTTPS&#xff08;TLS加密&#xff09;紧密相关&#xff0c;甚至强制…...

如何配置activemq,支持使用wss协议连接。

1、到阿里云申请一个证书&#xff0c;通过后下载jks证书。 2、配置activemq&#xff1a; 打开activemq安装目录中“conf/activemq.xml”&#xff0c;增加以下记录&#xff1a; <transportConnectors> <transportConnector name"wss" uri"…...

GO语言内存管理结构

文章目录 1、内存分区1.1、栈&#xff08;Stack&#xff09;1.2、堆&#xff08;Heap&#xff09; 2、堆内存管理结构2.1、内存分配器&#xff08;MCache → MArena → MSpan → MHeap&#xff09;2.2、大小分类&#xff08;Size Class&#xff09;2.3、分配流程 3、垃圾回收&a…...

初学c语言14(指针6)

一.sizeof和strlen的对比 1.sizeof 操作符&#xff0c;计算变量所占空间大小 2.strlen 库函数&#xff0c;函数原型为&#xff1a; 求的是字符串的长度&#xff0c;统计的是“\0”之前的字符个数 二.指针和笔试题解析 补充&#xff1a;数组名的意义 1.sizeof(数组名) 这…...

数字化转型-4A架构之技术架构

4A架构系列文章 数字化转型-4A架构&#xff08;业务架构、应用架构、数据架构、技术架构&#xff09; 数字化转型-4A架构之业务架构 数字化转型-4A架构之应用架构 数字化转型-4A架构之数据架构 数字化转型-4A架构之技术架构 一、 技术架构 Technology Architecture 1. 技…...

什么是SparkONYarn模式

1. 什么是 Spark on YARN&#xff1f; Spark on YARN 是 Apache Spark 的一种部署模式&#xff0c;允许 Spark 应用程序在 Hadoop YARN 集群上运行&#xff0c;充分利用 YARN 的资源管理和调度能力。这种模式将 Spark 与 Hadoop 生态深度集成&#xff0c;使企业能够在同一集群…...

kaggle薅羊毛

参考&#xff1a;https://pytorch-tutorial.readthedocs.io/en/latest/tutorial/chapter05_application/5_1_kaggle/#512-kaggle https://github.com/girls-in-ai/Girls-In-AI/blob/master/machine_learning_diary/data_analysis/kaggle_intro.md 1&#xff0c;code training…...

TCP 三次握手建立连接详解

文章目录 一、三次握手流程1、第一次握手2、第二次握手3、第三次握手 二、引申问题1、报文丢失&#xff0c;会发生什么&#xff1f;1.1、第一次握手丢失1.2、第二次握手丢失1.3、第三次握手丢失 2、为什么 ISN(Initial Sequence Number&#xff0c;初始序列号) 不固定3、为什么…...

高海拔和远距离的人员识别:面部、体型和步态的融合

大家读完就觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 我们解决了在无约束环境中进行全身人体识别的问题。这个问题出现在诸如IARPA高空和远距离生物识别与身份识别&#xff08;BRIAR&#xff09;计划等监视场景中&#xff0c;其中生物识别数据是在长…...

Golang实践录:在go中使用curl实现https请求

之前曾经在一个 golang 工程调用 libcur 实现 https的请求&#xff0c;当前自测是通过的。后来迁移到另一个小系统出现段错误&#xff0c;于是对该模块代码改造&#xff0c;并再次自测。 问题提出 大约2年前&#xff0c;在某golang项目使用libcurl进行https请求&#xff08;参…...

自然语言处理入门级项目——文本分类

文章目录 前言1.数据预处理1.1数据集介绍1.2数据集抽取1.3划分数据集1.4数据清洗1.5数据保存 2.样本的向量化表征2.1词汇表2.2向量化2.3自定义数据集2.4备注 结语 前言 本篇博客主要介绍自然语言处理领域中一个项目案例——文本分类&#xff0c;具体而言就是判断评价属于积极还…...

如何利用大模型对文章进行分段,提高向量搜索的准确性?

利用大模型对文章进行分段以提高向量搜索准确性,需结合文本语义理解、分块策略优化以及向量表示技术。以下是系统性的解决方案: 一、分块策略的核心原则 语义完整性优先 分块需确保每个文本单元在语义上独立且完整。研究表明,当分块内容保持单一主题时,向量嵌入的语义表征能…...

一发入魂:极简解决 SwiftUI 复杂视图未能正确刷新的问题(上)

概述 各位似秃非秃小码农们都知道&#xff0c;在 SwiftUI 中视图是状态的函数&#xff0c;这意味着状态的改变会导致界面被刷新。 但是&#xff0c;对于有些复杂布局的 SwiftUI 视图来说&#xff0c;它们的界面并不能直接映射到对应的状态上去。这就会造成一个问题&#xff1…...

深入理解 Dijkstra 算法:原理、实现与优化

算法核心思想 Dijkstra算法采用贪心策略&#xff0c;其核心思想可以概括为&#xff1a; 初始化&#xff1a;设置起点到自身的距离为0&#xff0c;到其他所有点的距离为无穷大 迭代处理&#xff1a; 从未处理的顶点中选择当前距离起点最近的顶点 标记该顶点为已处理 通过该顶…...

Postman中https和http的区别是什么?

作为每天与API打交道的测试工程师,理解HTTP与HTTPS的区别不仅关乎协议本身,更直接影响测试方案设计。本文将用测试视角揭示二者在Postman中的关键差异,并分享实战排查技巧。 一、协议层本质差异(测试工程师需要知道的底层原理) 1. 安全传输机制对比 特性HTTPHTTPS加密方…...

软件设计师-下午题-试题4(15分)

目录 1 回溯法 1.1 N皇后问题 1.1.1 非递归求解N皇后问题 1.1.2 递归求解N皇后问题 1.2 真题 2 分治法 2.1 真题 3 动态规划法 3.1 0-1背包问题 3.2 真题 1 回溯法 1.1 N皇后问题 上图Q4与Q2在同一列且与Q1在同一斜线&#xff0c;先回溯到上一个皇后改变Q3皇后的位置…...

《隐私计算:数据安全与隐私保护的新希望》

一、引言 在数字化时代&#xff0c;数据已成为企业和组织的核心资产。然而&#xff0c;数据的收集、存储和使用过程中面临着诸多隐私和安全挑战。隐私计算作为一种新兴技术&#xff0c;旨在解决数据隐私保护和数据共享之间的矛盾。本文将深入探讨隐私计算的基本概念、技术原理、…...

leetcode二叉树相关题目复习(C语言版)

目录 1.单值二叉树 2.相同的树 3.对称二叉树 4.二叉树的前序遍历 5.另一颗树的子树 1.单值二叉树 思路1&#xff1a; 判断根节点、左节点与右节点的值是否相等&#xff0c;因为正向判断&#xff08;即判断三值相等返回true&#xff09;比较麻烦&#xff08;不能根节点满足…...

第十九次博客打卡

今天学习的内容是Java中的常见循环。 在 Java 中&#xff0c;常见的循环结构主要有以下几种&#xff1a;for 循环、while 循环、do-while 循环以及增强型 for 循环&#xff08;也称为 for-each 循环&#xff09;。 1. for 循环 for 循环是一种非常灵活的循环结构&#xff0c…...

【Pandas】pandas DataFrame describe

Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 TrueDataFrame.any(*[, axis, bool_only, skipna])用于判断…...

机器人示教操作

机器人基础操作 **ES机器人试教操作知识** **1. 视角移动** **1.1 基础模式** - 关节轴控制&#xff1a;通过关节1至关节6实现单轴正反转移动 - 直线移动&#xff1a;通过X/Y/Z坐标轴沿指定方向直线移动 - 旋转移动&#xff1a;通过RX/RY/RZ坐标轴绕指定轴旋转 **1.2 步进模式…...

浅聊一下数据库的索引优化

背景 这里的索引说的是关系数据库&#xff08;MSSQL&#xff09;中的索引。 本篇不是纯技术性的内容&#xff0c;只是聊一次性能调优的经历&#xff0c;包含到一些粗浅的实现和验证手段&#xff0c;所以&#xff0c;大神忽略即可。 额…对了&#xff0c;笔者对数据库的优化手段…...

山东大学软件学院软件工程计算机图形学复习笔记(2025)

写在前面&#xff1a; 现在是考完试的第二天&#xff0c;考试的内容还是有一部分没有复习到的…… 根据三角形的3个顶点坐标和内部某点坐标D&#xff0c;写出点D的基于面积的权重坐标Bresenham的算法描述与改进策略&#xff08;这里ppt上很不清晰&#xff09;以及直线反走样的…...

【Docker】Docker Compose方式搭建分布式内存数据库(Redis)集群

文章目录 开发环境开发流程运行效果Docker Desktop桌面中的Redis结点启动图Redis结点1的打印日志情况图 配置代码命令行启动配置文件: README.md删除集群信息新建数据目录本地Redis的结点的域名,并添加到/etc/hosts文件的末尾域名映射启动集群结点创建集群关闭集群结点 redis-c…...

如何在 Bash 中使用 =~ 操作符 ?

在 Bash 脚本世界中&#xff0c;有各种操作符可供我们使用&#xff0c;使我们能够操作、比较和测试数据。其中一个操作符是 ~ 操作符。这个操作符经常被忽视&#xff0c;但功能非常强大&#xff0c;它为我们提供了一种使用正则表达式匹配字符串模式的方法。 ~ 操作符语法 语法…...