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

代理模式详解与应用

代理模式(Proxy Pattern),也称为委托模式或 surrogate 模式,是一种结构型设计模式。它为其他对象提供一个代理以控制对这个对象的访问。通过引入代理对象,可以在不改变原始对象接口的前提下,添加额外的功能,如权限检查、延迟加载、日志记录等。代理模式使得客户端可以通过代理间接地操作目标对象,从而实现更灵活和安全的对象交互。

代理模式的特点

  1. 增强功能:可以在不修改原始对象的情况下为其添加新的行为,例如远程调用、缓存支持、事务管理等。
  2. 控制访问:可以限制或扩展对目标对象的操作权限,确保只有授权的客户端才能执行特定的方法。
  3. 延迟初始化:对于资源密集型的对象,可以通过代理模式实现懒加载,即在第一次使用时才创建实际对象。
  4. 透明性:对于客户端来说,代理和真实主题之间的区别是透明的,它们都实现了相同的接口。

代理模式的分类

根据代理的目的和实现方式,代理模式可以分为以下几种类型:

  • 远程代理(Remote Proxy):为一个位于不同地址空间的对象提供局部代表,用于跨越网络边界进行通信。
  • 虚拟代理(Virtual Proxy):根据需要创建开销大的对象,通常用于实现延迟加载。
  • 保护代理(Protection Proxy):控制对原始对象的访问权限,允许不同的用户有不同的访问级别。
  • 智能引用(Smart Reference):除了简单的代理功能外,还可以添加额外的行为,比如计数对象的引用次数、监视对象的访问等。

代理模式的组成

  • Subject(抽象主题接口):定义了真实主题和代理类共同的接口,确保两者可以被一致地对待。
  • RealSubject(真实主题):实现了Subject接口的具体类,负责完成业务逻辑。
  • Proxy(代理类):同样实现了Subject接口,内部持有一个指向RealSubject的引用,并在其基础上添加了额外的功能。

代理模式的实现

我们将通过一个简单的例子来演示代理模式的应用:假设我们有一个在线书店系统,其中包含了一个图书库存查询服务。为了提高性能并减少数据库压力,我们可以使用代理模式来实现缓存机制,即当用户请求查看某本书的信息时,先从缓存中查找,如果不存在则去数据库中查询并将结果存入缓存。

示例代码

// 抽象主题接口 - BookService
interface BookService {String findBookInfo(String isbn);
}// 真实主题 - RealBookService
class RealBookService implements BookService {@Overridepublic String findBookInfo(String isbn) {// Simulate database query delaytry {Thread.sleep(1000); // Sleep for a second to simulate DB access time} catch (InterruptedException e) {e.printStackTrace();}return "Book Info from Database: ISBN=" + isbn;}
}// 代理类 - CachedBookService
class CachedBookService implements BookService {private final Map<String, String> cache = new HashMap<>();private final RealBookService realBookService;public CachedBookService() {this.realBookService = new RealBookService();}@Overridepublic String findBookInfo(String isbn) {if (!cache.containsKey(isbn)) {System.out.println("Cache miss, querying database...");String bookInfo = realBookService.findBookInfo(isbn);cache.put(isbn, bookInfo);} else {System.out.println("Cache hit!");}return cache.get(isbn);}
}

使用示例

public class ProxyPatternDemo {public static void main(String[] args) {BookService bookService = new CachedBookService();// 第一次查询会命中数据库System.out.println(bookService.findBookInfo("978-3-16-148410-0"));// 第二次查询会命中缓存System.out.println(bookService.findBookInfo("978-3-16-148410-0"));}
}

代理模式的应用场景

  • 当需要在不改变原有对象接口的情况下,为其添加新的功能或行为时。
  • 如果想要控制对某些敏感操作的访问权限,可以通过代理模式实现细粒度的安全控制。
  • 在处理大型对象或复杂计算时,可以使用虚拟代理来实现延迟加载,优化系统性能。
  • 对于分布式的应用程序,远程代理可以帮助隐藏底层的网络通信细节,使客户端能够像调用本地方法一样轻松地调用远程服务。

结语

希望本文能帮助您更好地理解代理模式的概念及其实际应用。如果您有任何疑问或建议,请随时留言交流。

相关文章:

代理模式详解与应用

代理模式&#xff08;Proxy Pattern&#xff09;&#xff0c;也称为委托模式或 surrogate 模式&#xff0c;是一种结构型设计模式。它为其他对象提供一个代理以控制对这个对象的访问。通过引入代理对象&#xff0c;可以在不改变原始对象接口的前提下&#xff0c;添加额外的功能…...

Model-based RL自动出价算法的演进之路

▐ 导读 近年来&#xff0c;强化学习自动出价算法已成为智能投放领域的标志性技术&#xff0c;然而其所存在的在离线不一致、线上数据覆盖空间受限等关键问题尚未被完全解决。在本文中&#xff0c;我们提出一种Model-based RL&#xff08;MBRL&#xff09;自动出价算法训练新范…...

.NET AI 开发人员库 --AI Dev Gallery简单示例--问答机器人

资源及介绍接上篇 nuget引用以下组件 效果展示&#xff1a; 内存和cpu占有&#xff1a; 代码如下&#xff1a;路径换成自己的模型路径 模型请从上篇文尾下载 internal class Program{private static CancellationTokenSource? cts;private static IChatClient? model;privat…...

框架部分面试题学习

IOC容器&#xff0c;AOP IOC &#xff1a;依赖反转&#xff0c;将对象的创建&#xff0c;组装&#xff0c;管理的控制权限从应用程序反转到IOC容器中。由springboot的来实现对象的自动装配和注入。 当某个类使用了Componnet 注解后&#xff0c;标记为一个组件。那么这个类在项…...

tdengine数据库使用java连接

1 首先给你的项目添加依赖 <dependency> <groupId>com.taosdata.jdbc</groupId> <artifactId>taos-jdbcdriver</artifactId> <version>3.4.0</version> <!-- 表示依赖不会传递 --> </dependency> 注意&am…...

Java 模板变量替换——字符串替换器(思路Mybatis的GenericTokenParser)

Java 模板变量替换——字符串替换器&#xff08;思路Mybatis的GenericTokenParser&#xff09; 思路字符串替换器 思路 模板变量替换无非是寻找出字符串&#xff08;模板&#xff09;中的特殊标记&#xff0c;用对应的变量进行字符串替换。 提到变量替换&#xff0c;大家第一能…...

跨界融合:人工智能与区块链如何重新定义数据安全?

引言&#xff1a;数据安全的挑战与现状 在信息化驱动的数字化时代&#xff0c;数据已成为企业和个人最重要的资产之一。然而&#xff0c;随着网络技术的逐步优化和数据量的爆发式增长&#xff0c;数据安全问题也愈变突出。 数据安全现状&#xff1a;– 数据泄露驱动相关事件驱…...

android 自定义SwitchCompat,Radiobutton,SeekBar样式

纯代码的笔记记录。 自定义SwitchCompat按钮的样式 先自定义中间的圆球switch_thumb_bg.xml <?xml version"1.0" encoding"utf-8"?> <shape xmlns:android"http://schemas.android.com/apk/res/android"android:shape"oval&q…...

计算机网络的定义与发展历程

计算机网络的定义 计算机网络是指通过通信设备和传输介质将分布在不同地点的计算机及其相关设备&#xff08;如打印机、服务器等&#xff09;连接起来&#xff0c;按照一定的通信协议进行数据交换与资源共享的系统。计算机网络的基本功能包括&#xff1a;信息的传输、资源共享…...

对比学习 (Contrastive Learning) 算法详解与PyTorch实现

对比学习 (Contrastive Learning) 算法详解与PyTorch实现 目录 对比学习 (Contrastive Learning) 算法详解与PyTorch实现1. 对比学习 (Contrastive Learning) 算法概述1.1 自监督学习1.2 对比学习的优势2. 对比学习的核心技术2.1 正样本对与负样本对2.2 对比损失函数2.3 数据增…...

DBeaver执行本地的sql语句文件避免直接在客户端运行卡顿

直接在客户端运行 SQL 语句和通过加载本地文件执行 SQL 语句可能会出现不同的性能表现&#xff0c;原因可能包括以下几点&#xff1a; 客户端资源使用&#xff1a; 当你在客户端界面直接输入和执行 SQL 语句时&#xff0c;客户端可能会消耗资源来维护用户界面、语法高亮、自动完…...

C++ 的 pair 和 tuple

1 std::pair 1.1 C 98 的 std::pair 1.1.1 std::pair 的构造 ​ C 的二元组 std::pair<> 在 C 98 标准中就存在了&#xff0c;其定义如下&#xff1a; template<class T1, class T2> struct pair;std::pair<> 是个类模板&#xff0c;它有两个成员&#x…...

Zookeeper 集群安装

Zookeeper 集群 主机 IP SoftWare Port OS Myidnode1 192.168.230.128 apache-zookeeper-3.7.1 2181 Centos 7 1 node2 192.168.230.129 apache-zookeeper-3.7.1...

git merge与rebase区别以及实际应用

在 Git 中&#xff0c;merge 和 rebase 是两种将分支的更改合并到一起的常用方法。虽然它们都可以实现类似的目标&#xff0c;但它们的工作方式和效果有所不同。 1. Git Merge 定义&#xff1a;git merge 是将两个分支的历史合并在一起的一种操作。当你执行 git merge 时&…...

kvm虚拟机出现应用程序无法正常启动报0xc0000142错误

场景&#xff1a;我的是window10虚拟机&#xff0c;在运行我的软件的时候&#xff0c;出现0xc0000142错误&#xff0c;原因可能是cpu型号问题&#xff0c;某些虚拟cpu可能没有特定的指令&#xff0c;只需要修改虚拟机配置文件以下参数即可...

Redis 安装与 Spring Boot 集成指南

安装 Redis 和将其与 Spring Boot 应用集成是构建高效缓存解决方案的常见步骤。以下是详细的指南&#xff0c;帮助你在本地环境中安装 Redis&#xff0c;并在 Spring Boot 项目中配置和使用它。 1. 安装 Redis Windows 环境 Redis 官方并不直接支持 Windows&#xff0c;但你…...

Flink集成TDEngine来批处理或流式读取数据进行流批一体化计算(Flink SQL)拿来即用的案例

Flink 以其流批一体化的编程模型而备受青睐。它支持高吞吐、低延迟的实时流计算,同时在批处理方面也表现出色。Flink 提供了丰富的 API,如 DataStream API 和 DataSet API,方便开发者进行数据处理操作,包括转换、聚合、连接等,使得开发者能够轻松构建复杂的数据处理逻辑。…...

【STM32】利用SysTick定时器定时1s

1.SysTick简单介绍 SysTick定时器是一个24位的倒计数定时器&#xff0c;当计数到0时&#xff0c;将从RELOAD寄存器中自动重装载定时初值&#xff0c;开始新一轮计数。 SysTick定时器用于在每隔一定的时间产生一个中断&#xff0c;即使在系统睡眠模式下也能工作。 关于SysTic…...

Python中的format格式化、填充与对齐、数字格式化方式

文章目录 一、format语法二、format格式化的用法2.1、按照先后顺序替换{}2.2、按照索引进行匹配替换{0}2.3、按关键字索引进行匹配替换2.4、通过列表索引格式化字符串2.5、使用元组2.6、通过字典设置格式化字符串2.7、混合使用 三、字符串填充与对齐3.1、左对齐及填充3.2、右对…...

winform第三方界面开源库AntdUI的使用教程保姆级环境设置篇

1. AntdUI 1.1. 导入项目 1.1.1. 首先新建一个空白的基于.net的Winfrom项目1.1.2. 复制AntdUI中src目录到我们的解决方案下面1.1.3. 解决方案下添加现有项目1.1.4. 添加项目引用 1.2. 编写代码 1.2.1. 改写Form1类&#xff0c;让其继承自public partial class Form1 : AntdUI.W…...

OpenWrt补丁踩坑实录:从‘尾随空格’警告到make update失败的完整排错指南

OpenWrt补丁踩坑实录&#xff1a;从‘尾随空格’警告到make update失败的完整排错指南 当你第一次尝试为OpenWrt制作补丁时&#xff0c;可能会觉得这就像在玩一个充满陷阱的迷宫游戏。每次你以为按照教程走就能顺利通关&#xff0c;却总会在某个转角遇到意想不到的错误提示。本…...

别再让电机乱跑了!用STM32CubeIDE配置TB6612驱动GB37-520电机,保姆级避坑指南

从零到精通的STM32电机控制实战&#xff1a;TB6612驱动GB37-520全流程解析 第一次尝试用STM32驱动电机时&#xff0c;我遇到了一个令人抓狂的现象——电机要么纹丝不动&#xff0c;要么突然疯狂旋转&#xff0c;甚至冒出可疑的青烟。这种经历在初学者中非常普遍&#xff0c;而…...

R语言+ggplot2:手把手教你绘制Cell期刊同款世界地图采样图(附完整代码与数据)

R语言ggplot2&#xff1a;手把手教你绘制Cell期刊同款世界地图采样图&#xff08;附完整代码与数据&#xff09; 在科研论文中&#xff0c;一张精美的世界地图采样图往往能直观展示研究样本的全球分布&#xff0c;为论文增色不少。顶级期刊如Cell、Nature、Science上的文章&…...

Perplexity数据验证功能全链路解析(98.7%准确率背后的4层校验架构)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Perplexity数据验证功能全链路解析&#xff08;98.7%准确率背后的4层校验架构&#xff09; Perplexity 的数据验证并非单一规则匹配&#xff0c;而是融合语义一致性、来源可信度、时效性约束与逻辑闭环性的四维…...

UVM验证效率提升:利用仿真器保存恢复机制消除冗余配置周期

1. 验证环境中的冗余周期之痛&#xff1a;一个普遍存在的效率瓶颈在芯片验证领域&#xff0c;尤其是使用UVM&#xff08;Universal Verification Methodology&#xff09;构建的复杂验证环境中&#xff0c;我们常常会面临一个看似不起眼、实则消耗巨大的问题&#xff1a;冗余的…...

5步实现Windows直接安装Android应用:APK Installer完全指南

5步实现Windows直接安装Android应用&#xff1a;APK Installer完全指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想过&#xff0c;在Windows电脑上安装…...

本地视频怎么去水印?2026年实测去水印方法和软件推荐指南

为什么本地视频需要去水印 无论是从社交平台保存下来的视频&#xff0c;还是朋友转发的素材&#xff0c;视频上的水印往往会影响观看体验。特别是对于内容创作者而言&#xff0c;需要将多个平台的素材进行二次创作时&#xff0c;去除水印成了必不可少的环节。本地视频去水印不仅…...

30分钟搞定黑苹果:OpCore Simplify如何让Hackintosh配置从专业难题变成简单操作

30分钟搞定黑苹果&#xff1a;OpCore Simplify如何让Hackintosh配置从专业难题变成简单操作 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂…...

全志T3工业级评估板深度评测:国产化、接口性能与Docker容器化实践

1. 开箱初探&#xff1a;一份诚意满满的工业级“全家桶”作为一名在嵌入式硬件开发领域摸爬滚打了十多年的老工程师&#xff0c;我经手过的评估板、开发板少说也有上百款。从早期的ARM9到现在的多核A系列、RISC-V&#xff0c;每次开箱都像是一次探险。但这次拿到创龙科技&#…...

模板 ID 配置化: “公众号路由 + 模板消息发送” 封装成一个干净的业务 Service

文章目录 引言 I “公众号路由 + 模板消息发送” 多公众号 同模板不同 ID 公众号实例 公众号路由 模板消息发送 Service(业务层 ✅) 异步调用 II 公众号账号配置【升级版】 账号配置 启用配置 模板 ID 解析器 公众号 Router(升级版 ✅) III 路由(Redis 版本) WxRedisOps…...