深入理解设计模式之代理模式

深入理解设计模式之:代理模式

一、什么是代理模式?

代理模式(Proxy Pattern)是一种结构型设计模式。它为其他对象提供一种代理以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介作用,可以在不改变目标对象的前提下,增强或控制对目标对象的访问。


二、代理模式的应用场景

  • 权限控制:如用户访问权限校验
  • 延迟加载:如大对象的懒加载
  • 远程代理:如RPC、RMI
  • 日志记录:如方法调用日志
  • 缓存代理:如结果缓存
  • 防火墙代理:如网络请求过滤

三、代理模式的分类

  1. 静态代理
    代理类在编译时就已经确定,代码量较大,灵活性较差。

  2. 动态代理
    代理类在运行时动态生成,Java 中常用 JDK 动态代理和 CGLIB 动态代理。


四、代理模式的结构

  • Subject(抽象主题):定义目标对象和代理对象的共同接口
  • RealSubject(真实主题):实现了 Subject 的真实对象
  • Proxy(代理对象):实现了 Subject,内部持有 RealSubject 的引用

五、静态代理实现示例(Java)

1. 定义接口

public interface UserService {void login(String username, String password);
}

2. 实现真实主题

public class UserServiceImpl implements UserService {@Overridepublic void login(String username, String password) {System.out.println(username + " 登录系统,密码:" + password);}
}

3. 实现代理类

public class UserServiceProxy implements UserService {private UserService realService;public UserServiceProxy(UserService realService) {this.realService = realService;}@Overridepublic void login(String username, String password) {// 代理增强:如权限校验、日志System.out.println("【代理】开始登录校验...");realService.login(username, password);System.out.println("【代理】登录操作已记录日志。");}
}

4. 客户端调用

public class Main {public static void main(String[] args) {UserService realService = new UserServiceImpl();UserService proxy = new UserServiceProxy(realService);proxy.login("Tom", "123456");}
}

输出结果:

【代理】开始登录校验...
Tom 登录系统,密码:123456
【代理】登录操作已记录日志。

六、JDK 动态代理实现示例

1. 定义接口和真实主题(同上)

2. 创建动态代理处理器

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class UserServiceInvocationHandler implements InvocationHandler {private Object target;public UserServiceInvocationHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("【动态代理】方法调用前...");Object result = method.invoke(target, args);System.out.println("【动态代理】方法调用后...");return result;}
}

3. 客户端调用

public class Main {public static void main(String[] args) {UserService realService = new UserServiceImpl();UserService proxy = (UserService) Proxy.newProxyInstance(realService.getClass().getClassLoader(),realService.getClass().getInterfaces(),new UserServiceInvocationHandler(realService));proxy.login("Alice", "password");}
}

输出结果:

【动态代理】方法调用前...
Alice 登录系统,密码:password
【动态代理】方法调用后...

七、代理模式的优缺点

优点:

  • 职责清晰,扩展性好
  • 可以在不修改目标对象的前提下增强功能
  • 控制对象访问,保护目标对象

缺点:

  • 增加系统复杂度
  • 静态代理类过多,维护成本高
  • 动态代理对理解和调试有一定门槛

八、总结

代理模式是实际开发中非常常用的设计模式,Spring AOP、MyBatis Mapper、RPC 框架等都大量用到代理思想。掌握代理模式有助于理解 Java 动态代理、AOP 等高级特性。

建议:

  • 简单增强可用静态代理,复杂场景优先用动态代理
  • 结合实际业务场景选择合适的代理方式

如需更多设计模式讲解或源码分析,欢迎留言交流!

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

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

相关文章

Ubuntu设置之初始化

安装SSH服务 # 安装 OpenSSH Server sudo apt update sudo apt install -y openssh-server# 检查 SSH 服务状态 sudo systemctl status ssh # Active: active (running) since Sat 2025-05-31 17:13:07 CST; 6s ago# 重启服务 sudo systemctl restart ssh自定义分辨率 新…

【仿生机器人】极具前瞻性的架构——认知-情感-记忆“三位一体的仿生机器人系统架构

基于您的深度需求分析,我将为您设计一个全新的"认知-情感-记忆"三位一体的仿生机器人系统架构。以下是经过深度优化的解决方案: 一、核心架构升级(三体认知架构) 采用量子纠缠式架构设计: 认知三角&#xf…

Python量化交易12——Tushare全面获取各种经济金融数据

两年前写过Tushare的简单使用: Python量化交易08——利用Tushare获取日K数据_skshare- 现在更新一下吧,这两年用过不少的金融数据库,akshare,baostock,雅虎的,pd自带的......发现还是Tushare最稳定最好用&…

python打卡day39@浙大疏锦行

知识点回顾 图像数据的格式:灰度和彩色数据模型的定义显存占用的4种地方 模型参数梯度参数优化器参数数据批量所占显存神经元输出中间状态 batchisize和训练的关系 1. 图像数据格式 - 灰度图像 :单通道,像素值范围通常0-255,形状为…

源码解析(二):nnUNet

原文 😀 nnU-Net 是一个用于生物医学图像分割的自配置深度学习框架,可自动适应不同的数据集。可用于处理和训练可能规模庞大的二维和三维医学图像。该系统分析数据集属性并配置优化的基于 U-Net 的分割流程,无需手动参数调整或深度学习专业知…

clickhouse如何查看操作记录,从日志来查看写入是否成功

背景 插入表数据后,因为原本表中就有数据,一时间没想到怎么查看插入是否成功,因为对数据源没有很多的了解,这时候就想怎么查看下插入是否成功呢,于是就有了以下方法 具体方法 根据操作类型查找,比如inse…

udp 传输实时性测量

UDP(用户数据报协议)是一种无连接的传输协议,适用于实时性要求较高的应用,如视频流、音频传输和游戏等。测量UDP传输的实时性可以通过多种工具和方法实现,以下是一些常见的方法和工具: 1. 使用 iperf 测试…

pikachu通关教程- over permission

如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作。 越权漏洞形成的原因是后台使用了 不合理的权限校验规则导致的。 水平越权 当我们以Lucy账号登录,查询个人信息时,会有…

nc 命令示例

nc -zv 实用示例 示例 1:测试单个 TCP 端口(最常见) 目标: 检查主机 webserver.example.com 上的 80 端口 (HTTP) 是否开放。 nc -zv webserver.example.com 80成功输出: Connection to webserver.example.com (19…

Redis是什么

注:本人不懂Redis是什么,问的大模型,让它用生动浅显的语言向我解释。为了防止忘记,我把它说的记录下来。接下来的解释都是大模型生成的,如果有错误的地方欢迎指正 。 Redis 是什么?(一句话解释&…

CVE-2021-28164源码分析与漏洞复现

漏洞概述 漏洞名称:Jetty 路径解析逻辑漏洞导致 WEB-INF 敏感信息泄露 漏洞编号:CVE-2021-28164 CVSS 评分:7.5 影响版本:Jetty 9.4.37 - 9.4.38 修复版本:Jetty ≥ 9.4.39 漏洞类型:路径遍历/信息泄露 C…

颠覆传统!单样本熵最小化如何重塑大语言模型训练范式?

颠覆传统!单样本熵最小化如何重塑大语言模型训练范式? 大语言模型(LLM)的训练往往依赖大量标注数据与复杂奖励设计,但最新研究发现,仅用1条无标注数据和10步优化的熵最小化(EM)方法…

自动驾驶系统研发系列—激光雷达感知延迟:自动驾驶安全的隐形隐患?

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中一起航行,共同成长,探索技术的无限可能。 🚀 探索专栏:学…

【MySQL】事务及隔离性

目录 一、什么是事务 (一)概念 (二)事务的四大属性 (三)事务的作用 (四)事务的提交方式 二、事务的启动、回滚与提交 (一)事务的启动、回滚与提交 &am…

视觉分析明火检测助力山东化工厂火情防控

视觉分析技术赋能化工厂火情防控:从山东事故看明火与烟雾检测的应用价值 一、背景:山东化工事故中的火情防控痛点 近期,山东高密友道化学有限公司、淄博润兴化工科技有限公司等企业接连发生爆炸事故,暴露出传统火情防控手段的局…

【小程序】微信小程序备案失败,有请DeepSeek闪亮出场,看TA如何快速给出解决方案

🌹欢迎来到《小5讲堂》🌹 🌹这是《小程序》系列文章,每篇文章将以博主理解的角度展开讲解。🌹 🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!&a…

Oracle正则表达式学习

目录 一、正则表达简介 二、REGEXP_LIKE(x,匹配项) 三、REGEXP_INSTR 四、REGEXP_SUBSTR 五、REGEXP_REPLACE 一、正则表达简介 相关网址: https://cloud.tencent.com/developer/article/1456428 https://www.cnblogs.com/lxl57610/p/8227599.html https://…

vscode 代理模式(agent mode),简单尝试一下。

1. 起因, 目的: agent mode, 很流行,名气很大。简单试试效果,确实很强。agent mode, 取代人工,确实是前进了一大步。 2. 先看效果 效果对比,左边是 普通的AI 生成的, 右边是 代理…

贝锐蒲公英工业路由器R300A海外版:支持多国4G频段,全球组网

为更好地满足全球部署和企业出海项目的多样化需求,贝锐蒲公英异地组网工业路由器R300A海外版全新上市,并已正式上架速卖通!无论是跨国分支机构协同办公,还是海外工厂设备远程运维,R300A海外版都能为企业提供灵活、高性…

自然图像数据集

目录 CIFAR-10 数据集CIFAR-100 数据集AFHQ 数据集FFHQ 数据集 CIFAR-10 数据集 简介: CIFAR-10 是一个经典的图像分类数据集,广泛用于机器学习领域的计算机视觉算法基准测试。它包含60000幅32x32的彩色图像,分为10个类,每类6000…