23种设计模式-代理(Proxy)设计模式

代理设计模式

  • 🚩什么是代理设计模式?
  • 🚩代理设计模式的特点
  • 🚩代理设计模式的结构
  • 🚩代理设计模式的优缺点
  • 🚩代理设计模式的Java实现
  • 🚩代码总结
  • 🚩总结

🚩什么是代理设计模式?

代理设计模式(Proxy Pattern) 是一种 结构型设计模式,它为其他对象提供一种 代理 以控制对这个对象的访问。代理模式通过创建一个代理对象,在客户端和目标对象之间起到 中介作用,可以在不改变原始类代码的情况下增加额外的功能。

使用场景

  • 当需要 控制对对象的访问 时(如权限控制、延迟加载等)

  • 当需要 为对象提供额外功能 时(如日志记录、性能监控等)

  • 当需要 远程访问对象 时(如RPC调用)

🚩代理设计模式的特点

  • 中介作用:代理对象在客户端和目标对象之间起中介作用

  • 透明性:客户端无需知道使用的是代理还是真实对象

  • 功能扩展:可以在不修改目标对象的情况下增加额外功能

  • 访问控制:可以控制客户端对目标对象的访问

🚩代理设计模式的结构

代理模式主要包含以下部分:

  • Subject(抽象主题):定义真实主题和代理主题的共同接口

  • RealSubject(真实主题):实现真正的业务逻辑

  • Proxy(代理):持有真实主题的引用,控制对真实主题的访问

  • Client(客户端):通过代理对象间接访问真实主题

图例:

在这里插入图片描述

🚩代理设计模式的优缺点

✅ 优点

  • 职责清晰:真实主题只需关注核心业务逻辑

  • 高扩展性:可以在不修改目标对象的情况下增加功能

  • 智能化:代理可以实现延迟加载、访问控制等智能功能

❌ 缺点

  • 增加系统复杂度:引入了额外的代理层

  • 性能开销:代理调用会带来额外的处理时间

  • 可能违反开闭原则:某些代理实现可能需要修改代理类

🚩代理设计模式的Java实现

代码地址:GitHub

  • 创建 抽象主题 Subject 接口
/*** @author hanson.huang* @version V1.0* @InterfaceName Subject* @Description 抽象主题 Subject* @date 2025/3/24 19:16**/
public interface Subject {public void buy();
}
  • 创建 真实主题 RealSubject
/*** @author hanson.huang* @version V1.0* @ClassName RealSubject* @Description 真实主题 RealSubject* @date 2025/3/24 19:17**/
public class RealSubject implements Subject {@Overridepublic void buy() {System.out.println("付钱");}
}
  • 创建 代理 Proxy
/*** @author hanson.huang* @version V1.0* @ClassName Proxy* @Description 代理 Proxy* @date 2025/3/24 19:17**/
public class Proxy implements Subject {protected RealSubject realSubject;public Proxy(RealSubject realSubject) {this.realSubject = realSubject;}@Overridepublic void buy() {System.out.println("办理购买前的手续");realSubject.buy();System.out.println("办理购买后的手续");}
}
  • 测试代理模式
/*** @author hanson.huang* @version V1.0* @ClassName ProxyPattern* @Description 测试代理模式* @date 2025/3/24 19:08**/
public class ProxyPattern {public static void main(String[] args) {RealSubject realSubject = new RealSubject();Proxy proxy = new Proxy(realSubject);proxy.buy();}
}

📌 运行结果

在这里插入图片描述

🚩代码总结

  • 抽象主题 Subject 定义了真实主题和代理的共同接口

  • 真实主题 RealSubject 实现了核心业务逻辑

  • 代理 Proxy 控制对真实主题的访问并添加额外功能

  • 客户端 通过代理对象间接访问真实主题

🚩总结

  • 代理设计模式 通过引入代理对象控制对目标对象的访问

  • 核心是 在不改变原始类的情况下增加额外功能

  • 适用于 访问控制功能增强远程调用 等场景

✅ Java源码中的应用场景:

  1. Java动态代理:

    • java.lang.reflect.Proxy

    • 广泛应用于Spring AOP中

  2. RMI远程调用:

    • java.rmi.* 包中的远程对象代理
  3. MyBatis:

    • Mapper接口的代理实现

    • org.apache.ibatis.binding.MapperProxy

  4. Spring框架:

    • 事务管理的代理实现

    • 安全控制的代理实现

  5. Hibernate:

    • 延迟加载使用代理实现

    • org.hibernate.proxy.ProxyFactory

  6. Java标准库:

    • Collections.unmodifiableList() 返回的不可修改集合代理

    • Collections.synchronizedList() 返回的同步集合代理

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/41867.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE4学习笔记 FPS游戏制作29 更换武器时更换武器的图标

文章目录 制作物体图标UI添加获取武器图标的方法使用事件分发器,通知UI要换枪定义事件分发器调用事件分发器注册事件分发器 制作物体图标UI 在Fpp-UI上添加一个图片,改名为五weaponIcon,勾选SizeToContent,锚点放在右下角,对齐改…

Chrome 开发环境快速屏蔽 CORS 跨域限制!

Chrome 开发环境快速屏蔽 CORS 跨域限制【详细教程】 ❓ 为什么需要临时屏蔽 CORS? 在前后端开发过程中,我们经常会遇到 跨域请求被浏览器拦截 的问题。例如,你在 http://localhost:3000 调用 https://api.example.com 时,可能会…

【RAG综述系列】之 RAG 相关背景和基本原理

系列文章: 【RAG综述系列】之 RAG 相关背景和基本原理 【RAG综述系列】之 RAG 特点与挑战以及方法与评估 【RAG综述系列】之 RAG 先进方法与综合评估 【RAG综述系列】之 RAG 应用和未来方向 正文: 检索增强生成(Retrieval-Augmented Gen…

德昂观点:如何看待MicroStrategy改名为Strategy?

2025年2月,纳斯达克上市公司MicroStrategy(股票代码:MSTR)宣布更名为“Strategy”,并同步启用全新品牌标识与橙色主视觉。这不仅是品牌形象的更新,更是公司战略方向的明确宣示。德昂作为MSTR中国区BI合作伙…

计算机视觉算法实战——手术导航:技术、应用与未来

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​ ​​​​​​​​​ ​​ 1. 手术导航中的计算机视觉:领域介绍 计算机视觉在手术导航领域的应用代表了现代医学与人工智…

Java全栈面试宝典:内存模型与Spring设计模式深度解析

目录 一、JVM内存模型进阶篇 🔥 问题13:堆与栈的六大维度对比 内存结构对比图 核心差异对照表 🔥 问题14:三区联动内存模型解析 代码内存分配图解 三区协作流程图 二、Spring设计模式全景解析 🌟 Spring框架七…

FALL靶场通关攻略

1,下载好靶机后打开,通过kali扫描靶机ip和端口,得到靶机ip为192.168.50.144 2,扫描目录 3,访问靶机 4,访问扫描到的test.php,得到缺少GET请求参数的提示 5,使用FUZZ来扫出参数为file 6&#xff…

《C++11:bind绑定器与function包装器》

CSTL中提供了bind1绑定器,通常与函数对象一起使用。 函数对象是重载了operator()函数的对象。 将二元函数对象operator()的第一个参数绑定为固定的x来构造一元函数对象。返回绑定了第一个参数的函数对象。 将二元函数…

JS 防抖与节流

防抖 核心思想:延迟执行,只有在事件触发的频率降低到一定程度后才会执行,而且如果事件持续触发,之前地所有执行都会被取消。 有的操作是高频触发的,但是其实只需要一次触发。比如短时间内多次缩放页面resize&#xff0…

【C/C++算法】从浅到深学习--- 简单模拟算法(图文兼备 + 源码详解)

绪论:冲击蓝桥杯一起加油!! 每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论​: 本篇是一些简单的模拟算法,其中模拟的本质就是就是根据题目意思进行代码的…

​​解锁 JavaScript DOM:节点操作的核心方法与最佳实践

引言 在当今动态化的 Web 世界中,用户早已不满足于静态的网页展示,而是期待流畅的交互体验——点击按钮弹出菜单、滚动页面加载数据、实时搜索过滤内容……这些功能的背后,都离不开 ​JavaScript DOM(文档对象模型)操…

Android 12系统源码_系统启动(二)Zygote进程

前言 Zygote(意为“受精卵”)是 Android 系统中的一个核心进程,负责 孵化(fork)应用进程,以优化应用启动速度和内存占用。它是 Android 系统启动后第一个由 init 进程启动的 Java 进程,后续所有…

精华贴分享|从不同的交易理论来理解头肩形态,殊途同归

本文来源于量化小论坛策略分享会板块精华帖,作者为孙小迪,发布于2025年2月17日。 以下为精华帖正文: 01 前言 学习了一段时间交易后,我发现在几百年的历史中,不同门派的交易理论对同一种市场特征的称呼不一样&#x…

C++智能指针万字详细讲解(包含智能指针的模拟实现)

在笔试,面试中智能指针经常出现,如果你对智能指针的作用,原理,用法不了解,那么可以看看这篇博客讲解,此外本博客还简单模拟实现了各种指针,在本篇的最后还应对面试题对智能指针的知识点进行了拓…

学习threejs,使用多面体(IcosahedronGeometry、TetrahedronGeometry、OctahedronGeometry等)

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.PolyhedronGeometry …

DeepSeek详解:探索下一代语言模型

文章目录 前言一、什么是DeepSeek二、DeepSeek核心技术2.1 Transformer架构2.1.1 自注意力机制 (Self-Attention Mechanism)(a) 核心思想(b) 计算过程(c) 代码实现 2.1.2 多头注意力 (Multi-Head Attention)(a) 核心思想(b) 工作原理(c) 数学描述(d) 代码实现 2.1.3 位置编码 (…

【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解

【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解 文章目录 【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解前言YOLOV1的模型结构YOLOV1模型的基本执行流程YOLOV1模型的网络参数YOLOV1模型的训练方式 YOLOV1的核心思想前向传播阶段网格单元(grid cell)…

网络运维学习笔记(DeepSeek优化版) 022 HCIP-Datacom路由概念、BFD协议详解与OSPF第一课

文章目录 路由概念、BFD协议详解与OSPF第一课一、路由协议优先级与选路原则1.1 路由协议优先级对照表1.2 路由选路核心原则 二、BFD(Bidirectional Forwarding Detection,双向转发检测)的配置与应用2.1 双向心跳探测(双端配置&…

单应性矩阵(homography)

利用单应性矩阵计算内外参矩阵 利用单应性矩阵解决问题 问题描述:

Scavenge算法的优缺点问题

Scavenge 的缺点是只能使用堆内存中的一半,这是由划分空间和复制机制所决定的。但 Scavenge 由于只复制存活的对象,并且对于生命周期短的场景,存活对象只占少部分,所以它在时间效率上有优异的表现。 由于 Scavenge 是典型的牺牲空…