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

【设计模式】代理模式

简介
假设你在网上购物时,快递员无法直接将包裹送到你手中(比如你不在家)。
代理模式的解决方案是:
快递员将包裹交给小区代收点(代理),代收点代替你控制和管理包裹的访问。

代收点可以添加额外功能:比如验证你的身份、暂存包裹直到你有空取件。

你最终通过代收点间接拿到包裹,整个过程保护了你的隐私和便利性。

适用场景
远程代理:访问远程对象(如网络服务调用)。

虚拟代理:延迟创建开销大的对象(如图片懒加载)。

保护代理:控制权限(如接口访问权限验证)。

日志代理:记录方法调用信息(如监控系统)。

优点
隔离目标对象与客户端,增强安全性。

在不修改目标对象的前提下扩展功能。

缺点
增加代码复杂度(需额外代理类)。

可能降低系统响应速度(代理层处理逻辑)。

类图

在这里插入图片描述

代码

// 抽象主题:用户网购行为
interface Shopping {
void receivePackage(String packageName);
}// 真实主题:快递直接送货
class CourierDelivery implements Shopping {
@Override
public void receivePackage(String packageName) {
System.out.println("快递员已将包裹[" + packageName + "]送到用户手中!");
}
}// 代理类:代收点暂存包裹
class ParcelLockerProxy implements Shopping {
private Shopping courier;
private String pendingPackage;public ParcelLockerProxy() {
this.courier = new CourierDelivery();
}@Override
public void receivePackage(String packageName) {
// 代理控制访问:暂存包裹,延迟通知用户
System.out.println("代收点暂存包裹[" + packageName + "],等待用户取件");
this.pendingPackage = packageName;
notifyUser();
}private void notifyUser() {
// 模拟延迟通知
System.out.println("短信通知:您的包裹已到代收点,请及时领取!");
}
}// 客户端
public class ProxyDemo {
public static void main(String[] args) {
// 直接访问真实对象
Shopping courier = new CourierDelivery();
courier.receivePackage("手机");// 通过代理访问
Shopping proxy = new ParcelLockerProxy();
proxy.receivePackage("电脑");
}
}

实际场景
Spring 框架使用动态代理实现面向切面编程(AOP),例如事务管理,日志代理。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;// 接口:用户服务
interface UserService {
void addUser(String name);
}// 真实主题:用户服务实现
class UserServiceImpl implements UserService {
@Override
public void addUser(String name) {
System.out.println("添加用户: " + name);
}
}// 动态代理:日志增强
class LoggingProxy implements InvocationHandler {
private Object target;public LoggingProxy(Object target) {
this.target = target;
}@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("调用方法前记录日志: " + method.getName());
Object result = method.invoke(target, args);
System.out.println("调用方法后记录日志: " + method.getName());
return result;
}
}// 客户端
public class DynamicProxyDemo {
public static void main(String[] args) {
UserService realService = new UserServiceImpl();
UserService proxy = (UserService) Proxy.newProxyInstance(
realService.getClass().getClassLoader(),
realService.getClass().getInterfaces(),
new LoggingProxy(realService)
);proxy.addUser("张三");
}
}

相关文章:

【设计模式】代理模式

简介 假设你在网上购物时,快递员无法直接将包裹送到你手中(比如你不在家)。 代理模式的解决方案是: 快递员将包裹交给小区代收点(代理),代收点代替你控制和管理包裹的访问。 代收点可以添加额外…...

局域网:电脑或移动设备作为主机实现局域网访问

电脑作为主机 1. 启用电脑的网络发现、SMB功能 2. 将访问设备开启WIFI或热点,用此电脑连接;或多台设备连接到同一WIFI 3. 此电脑打开命令行窗口,查看电脑本地的IP地址 Win系统:输入"ipconfig",回车后如图 4.…...

图论的基础

E - Replace&#xff08;判环&#xff0c;破环成链&#xff09; #include <bits/stdc.h> #include <atcoder/dsu>using namespace std; using namespace atcoder;const int C 26;int main() {int n;cin >> n;string s, t;cin >> s >> t;if (s …...

Jetpack Compose CompositionLocal 深入解析:局部参数透传实践

Jetpack Compose CompositionLocal 深入解析&#xff1a;局部参数透传实践 在 Jetpack Compose 中&#xff0c;如何优雅地在组件之间传递数据&#xff0c;而不需要层层传参&#xff1f; CompositionLocal 就是为了解决这个问题的&#xff01; 1. 什么是 CompositionLocal&#…...

第十五届蓝桥杯大赛软件赛省赛Python 大学 C 组:3.数字诗意

题目1 数字诗意 在诗人的眼中&#xff0c;数字是生活的韵律&#xff0c;也是诗意的表达。 小蓝&#xff0c;当代顶级诗人与数学家&#xff0c;被赋予了”数学诗人”的美誉。他擅长将冰冷的数字与抽象的诗意相融合&#xff0c;并用优雅的文字将数学之美展现于纸上。 某日&…...

Oracle数据库数据编程SQL<8 文本编辑器Notepad++和UltraEdit(UE)对比>

首先&#xff0c;用户界面方面。Notepad是开源的&#xff0c;界面看起来比较简洁&#xff0c;可能更适合喜欢轻量级工具的用户。而UltraEdit作为商业软件&#xff0c;界面可能更现代化&#xff0c;功能布局更复杂一些。不过&#xff0c;UltraEdit支持更多的主题和自定义选项&am…...

P12013 [Ynoi April Fool‘s Round 2025] 牢夸 Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​)&#xff0c;有 m m m 个操作分两种&#xff1a; add ⁡ ( l , r , k ) \operatorname{add}(l,r,k) add(l,r,k)&#xff1a;对每个 i ∈ [ l , r ] i\in[l,r] i∈[l,r] 执行 …...

PostgreSQL LIKE 操作符详解

PostgreSQL LIKE 操作符详解 引言 在数据库查询中,LIKE 操作符是一种非常常用的字符串匹配工具。它可以帮助我们实现模糊查询,从而提高查询的灵活性。本文将详细介绍 PostgreSQL 中的 LIKE 操作符,包括其语法、使用方法以及一些注意事项。 LIKE 操作符语法 LIKE 操作符通…...

【前端】【Nuxt3】Nuxt3的生命周期

路由导航和中间件执行顺序 路由导航开始 中间件执行顺序&#xff1a; 全局中间件&#xff08;middleware/*.global.js&#xff09;布局中间件&#xff08;在definePageMeta中定义的布局级中间件&#xff09;页面中间件&#xff08;在definePageMeta中定义的页面级中间件&#…...

热更新简介+xLua基础调用

什么是冷更新 开发者将测试好的代码&#xff0c;发布到应用商店的审核平台&#xff0c;平台方会进行稳定性及性能测试。测试成功后&#xff0c;用户即可在AppStore看到应用的更新信息&#xff0c;用户点击应用更新后&#xff0c;需要先关闭应用&#xff0c;再进行更新。 什么是…...

大钲资本押注儒拉玛特全球业务,累计交付超2500条自动化生产线儒拉玛特有望重整雄风,我以为它破产倒闭了,担心很多非标兄弟们失业

1. 交易概况 时间与主体:大钲资本于2025年4月1日正式宣布完成对儒拉玛特自动化技术(苏州)有限公司及其全球子公司和关联企业的收购。交易通过大钲资本旗下美元基金设立的儒拉玛特(新加坡)公司作为控股主体进行,交易金额未披露。 收购范围:包括儒拉玛特亚太、欧洲、北美等…...

FPGA系统开发板调试过程不同芯片的移植步骤介绍

目录 1.我目前使用的开发板 2.不同开发板的移植 步骤一&#xff1a;芯片型号设置 步骤二&#xff1a;约束修改 步骤三、IP核更新 关于FPGA系统开发板调试过程中不同芯片的移植。我需要先理清楚FPGA开发中移植到不同芯片的一般流程。首先&#xff0c;移植通常涉及到更换FPG…...

算法设计与分析5(动态规划)

动态规划的基本思想 将一个问题划分为多个不独立的子问题&#xff0c;这些子问题在求解过程中可能会有些数据进行了重复计算。我们可以把计算过的数据保存起来&#xff0c;当下次遇到同样的数据计算时&#xff0c;就可以查表直接得到答案&#xff0c;而不是再次计算 动态规划…...

ModuleNotFoundError: No module named ‘matplotlib_inline‘

ModuleNotFoundError: No module named matplotlib_inline 1. ModuleNotFoundError: No module named matplotlib_inline2. matplotlib-inlineReferences 如果你在普通的 Python 脚本或命令行中运行代码&#xff0c;那么不需要 matplotlib_inline&#xff0c;因为普通的 Python…...

Mysql 中的 B+树 和 B 树在进行数据增删改查后的结构调整过程是怎样的?

B 树的增、删、改、查数据的调整过程 在 MySQL 中&#xff0c;B 树 是一种广泛用于存储引擎&#xff08;如 InnoDB&#xff09;中的索引结构。B 树的结构使得它非常适合于处理大量数据的插入、删除和查询等操作。B 树是一种自平衡的树数据结构&#xff0c;其中所有的值都存储在…...

在Rust生态中探索高性能HTTP服务器:Hyperlane初体验

在Rust生态中探索高性能HTTP服务器&#xff1a;Hyperlane初体验 最近在调研Rust的HTTP服务器方案时&#xff0c;发现了一个有趣的新项目——Hyperlane。这个轻量级库宣称在保持简洁API的同时&#xff0c;性能表现可圈可点。作为Rust生态的长期观察者&#xff0c;我决定深入体验…...

AI医疗诊疗系统设计方案

AI医疗诊疗系统设计方案 1. 项目概述 1.1 项目背景 随着人工智能技术的快速发展&#xff0c;将AI技术应用于医疗诊疗领域已成为提升医疗服务效率和质量的重要途径。本系统旨在通过AI技术辅助医生进行诊疗服务&#xff0c;提供智能化的医疗决策支持。 1.2 项目目标 提供全面…...

k8s的StorageClass存储类和pv、pvc、provisioner、物理存储的链路

k8s的StorageClass存储类和pv、pvc、provisioner、物理存储的链路 StorageClass能自动创建pv 在控制器中&#xff0c;直接声明storageClassName&#xff0c;不仅能自动创建pvc&#xff0c;也能自动创建pv stoageclass来自于provisioner&#xff0c;provisioner来自于pod&#x…...

【移动编程技术】作业1 中国现代信息科技发展史、Android 系统概述与程序结构 作业解析

单选题&#xff08;共 20 题&#xff0c;每题 5 分&#xff0c;满分 100 分&#xff09; (单选题) 1946 年第一台计算机问世&#xff0c;计算机的发展经历了 4 个时代&#xff0c;它们是&#xff08;&#xff09;。 选项&#xff1a; A. 模拟计算机、数字计算机、混合计算机、智…...

SQL Server数据库异常-[SqlException (0x80131904): 执行超时已过期] 操作超时问题及数据库日志已满的解决方案

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;获得2024年博客之星荣誉证书&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开发技术&#xff0c…...

使用ollama部署本地大模型(没有GPU也可以),实现IDEA和VS Code的git commit自动生成

详情 问豆包&#xff0c;提示词如下&#xff1a;收集下ollama相关信息&#xff0c;包括但不限于&#xff1a;官网地址/GitHub地址/文档地址 官网地址 https://ollama.com/ GitHub 地址 https://github.com/ollama/ollama 文档地址 https://github.com/ollama/ollama/blo…...

线程同步与互斥(上)

上一篇&#xff1a;线程概念与控制https://blog.csdn.net/Small_entreprene/article/details/146704881?sharetypeblogdetail&sharerId146704881&sharereferPC&sharesourceSmall_entreprene&sharefrommp_from_link我们学习了线程的控制及其相关概念之后&#…...

ngx_test_full_name

定义在 src\core\ngx_file.c static ngx_int_t ngx_test_full_name(ngx_str_t *name) { #if (NGX_WIN32)u_char c0, c1;c0 name->data[0];if (name->len < 2) {if (c0 /) {return 2;}return NGX_DECLINED;}c1 name->data[1];if (c1 :) {c0 | 0x20;if ((c0 &…...

R 列表:深入解析及其在数据分析中的应用

R 列表&#xff1a;深入解析及其在数据分析中的应用 引言 在R语言中&#xff0c;列表&#xff08;List&#xff09;是一种非常重要的数据结构&#xff0c;它允许将不同类型的数据项组合在一起。列表在数据分析、统计建模以及数据可视化中扮演着关键角色。本文将深入探讨R列表…...

智能体中的知识库、数据库与大模型详解

前言 在 LLM&#xff08;大语言模型&#xff09;驱动的智能体架构中&#xff0c;知识库&#xff08;Knowledge Base&#xff09;、数据库&#xff08;Database&#xff09;和大模型&#xff08;LLM&#xff09;是关键组成部分&#xff0c;它们共同决定了智能体的理解能力、决策…...

AMD Versal™ AI Core Series VCK190 Evaluation Kit

AMD Versal™ AI Core Series VCK190 Evaluation Kit AMD VCK190 是首款 Versal™ AI Core 系列评估套件&#xff0c;可帮助设计人员使用 AI 和 DSP 引擎开发解决方案&#xff0c;与当前的服务器级 CPU 相比&#xff0c;该引擎能够提供超过 100 倍的计算性能。Versal AI Core …...

ARM-外部中断,ADC模数转换器

根据您提供的图片&#xff0c;我们可以看到一个S3C2440微控制器的中断处理流程图。这个流程图展示了从中断请求源到CPU的整个中断处理过程。以下是流程图中各个部分与您提供的寄存器之间的关系&#xff1a; 请求源&#xff08;带sub寄存器&#xff09;&#xff1a; 这些是具体的…...

【从零实现Json-Rpc框架】- 项目实现 - 客户端注册主题整合 及 rpc流程示意

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

AWS 云运维管理指南

一、总体目标 高可用性:通过跨可用区 (AZ) 和跨区域 (Region) 的架构设计,确保系统运行可靠。性能优化:优化AWS资源使用,提升应用性能。安全合规:利用AWS内置安全服务,满足行业合规要求(如GDPR、ISO 27001、等保2.0)。成本管控:通过成本优化工具,减少浪费,实现FinOp…...

vector的实现:

我们之前讲了vector的接口&#xff0c;我们今天来看一下vector的底层的实现&#xff1a; 在gitee上面我们的这个已经实现好了&#xff0c;我们看gitee就可以&#xff1a;vector的实现/vector的实现/vector的实现.h 拾亿天歌/拾亿天歌 - 码云 - 开源中国 我们在这强调比较难的…...

flutter 专题 九十六 Flutter开发之常用Widgets

上一篇&#xff0c;我们介绍了基础Widgets&#xff0c;接下来&#xff0c;我们看一下Flutter开发中一些比较常见的Widget。 Flutter Widget采用现代响应式框架构建&#xff0c;这是从 React 中获得的灵感&#xff0c;中心思想是用widget构建你的UI。 Widget描述了他们的视图在…...

Linux环境下内存错误问题排查与修复

最近这几天服务器总是掉线&#xff0c;要查一下服务器的问题。可以首先查看一下计算机硬件&#xff0c;这是一台某鱼上拼凑的服务器&#xff1a; sudo lshw -shortH/W path Device Class Description system NF5270M3 (To be filled by O…...

flutter 专题 六十八 Flutter 多图片上传

使用Flutter进行应用开发时&#xff0c;经常会遇到选图、拍照等需求。如果要求不高&#xff0c;Flutter图库选择可以使用官方提供的image_picker&#xff0c;如果需要多选&#xff0c;那么可以使用multi_image_picker插件库。multi_image_picker库支持图库管理&#xff0c;多选…...

与总社团联合会合作啦

2025.4.2日&#xff0c;我社团向总社团联合会与暮光社团发起合作研究“浔川代码编辑器v2.0”。至3日&#xff0c;我社团收到回复&#xff1a; 总社团联合会&#xff1a; 总社团联合会已收到浔川社团官方联合会的申请&#xff0c;经考虑&#xff0c;我们同意与浔川社团官方联合…...

技巧:使用 ssh 设置隧道代理访问 github

问题 由于不可知的原因&#xff0c;在国内服务器不能访问 Github。但是有clone代码需求&#xff0c;这里介绍一种可行的方法。 解决办法 使用 ssh 设置代理&#xff0c;让代理服务器请求 github 解决。 第一步 ssh -fND 1080 用户名代理服务器IP这里的意思是监听 1080 端口…...

安装 TabbyAPI+Exllamav2 和 vLLM 的详细步骤

在 5090 显卡上成功安装 TabbyAPIExllamav2 和 vLLM 并非易事&#xff0c;经过一番摸索&#xff0c;我总结了以下详细步骤&#xff0c;希望能帮助大家少走弯路。 重要提示&#xff1a; 用户提供的 PyTorch 安装使用了 cu128&#xff0c;这并非标准 CUDA 版本。请根据你的系统实…...

Linux 进程信号

目录 信号 生活角度的信号 技术应用角度的信号 signal函数 信号概念 用kill -l命令可以察看系统定义的信号列表 信号处理常见方式概览 信号的产生 通过键盘组合键发送信号 通过系统函数向进程发信号 由软件条件产生信号 由硬件异常产生信号 信号的保存 阻塞信号 ​…...

【学习篇】fastapi接口定义学习

fastapi学习链接&#xff1a;用户指南 1. 路径参数 访问fastapi接口的默认http路径为http://127.0.0.1:8000&#xff0c;/items为定义的接口函数read_item的路径&#xff0c;/{item_id}这个用大括号括起来的参数就是路径参数&#xff0c;接口函数可以通过引用这个路径参数名称…...

第十二步:react

React 1、安装 1、脚手架 npm i -g create-react-app&#xff1a;安装react官方脚手架create-react-app 项目名称&#xff1a;初始化项目 2、包简介 react&#xff1a;react框架的核心react-dom&#xff1a;react视图渲染核心react-native&#xff1a;构建和渲染App的核心…...

MySQL简介

MySQL 是由瑞典 MySQL AB 公司开发的一款开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;现归属 Oracle 公司。以下是其核心特点及简介&#xff1a; 1. 基础特性 - 开源免费&#xff1a;遵循 GPL 协议&#xff0c;个人及中小型企业可免费使用&#xff0c;…...

AIGC时代Kubernetes企业级云原生运维实战:智能重构与深度实践指南

文章目录 一、AIGC技术栈与Kubernetes的深度融合1. 智能配置生成&#xff1a;从YAML到自然语言2. 动态资源优化&#xff1a;AI驱动的弹性伸缩 二、智能运维体系架构深度解析四维能力矩阵增强实现&#xff1a;关键组件升级代码示例&#xff1a; 三、企业级实战策略深度实践策略1…...

市场波动与交易策略优化

市场波动与交易策略优化 在交易市场中&#xff0c;价格波动是常态。如何有效应对市场的波动&#xff0c;制定合理的交易策略&#xff0c;成为许多交易者关注的重点。本文将探讨市场波动的影响因素&#xff0c;并介绍应对不同市场波动环境的策略。 一、市场波动的影响因素 市场供…...

Prolog语言的移动UI设计

Prolog语言的移动UI设计 随着移动设备的普及&#xff0c;用户界面的设计已成为软件开发的重要组成部分。移动UI设计不仅要注重美观&#xff0c;更要关注用户体验和功能的实现。使用Prolog语言进行移动UI设计&#xff0c;虽然相对少见&#xff0c;但其逻辑编程的特性为复杂的交…...

linux 命令 awk

awk 是 Linux/Unix 系统中一个强大的文本处理工具&#xff0c;尤其擅长处理结构化文本数据&#xff08;如日志、表格数据&#xff09;。它不仅是命令行工具&#xff0c;还是一种脚本语言&#xff0c;支持变量、条件、循环等编程特性 1. 基本语法 awk [选项] 模式 {动作} 文件名…...

在 PyQt 加载 UI 三种方法

目录 方法一&#xff1a;使用 uic 模块动态加载 &#xff08;不推荐用于大型项目&#xff09; 方法二&#xff1a;将 UI 文件编译为 Python 模块后导入 方法3&#xff1a;使用uic模块直接在代码中加载UI文件 注意事项 总结&#xff1a; 在PyQt中&#xff0c;加载UI文件通常…...

前端快速入门学习2-HTML

一、概述 HTML全称是Hypertext Markup Language(超文本标记语言) HTML通过一系列的 标签(也称为元素) 来定义文本、图像、链接等等。HTML标签是由尖括号包围的关键字。 标签通常成对出现&#xff0c;包括开始标签和结束标签(也称为双标签)&#xff0c;内容位于这两个标签之间…...

Cortex-M系列MCU的位带操作

Cortex-M系列位带操作详解 位带&#xff08;Bit-Banding&#xff09;是Cortex-M3/M4等处理器提供的一种硬件特性&#xff0c;允许通过别名地址对内存或外设寄存器中的单个位进行原子读-改-写操作&#xff0c;无需禁用中断或使用互斥锁。以下是位带操作的完整指南&#xff1a; …...

【嵌入式-stm32电位器控制LED亮灭以及编码器控制LED亮灭】

嵌入式-stm32电位器控制LED亮暗 任务代码Key.cKey.hmain.c 实验现象 任务 本文主要介绍利用stm32f103C8T6实现电位器控制PWM的占空比大小来改变LED亮暗程度&#xff0c;按键实现使用定时器非阻塞式&#xff0c;其中一个按键切换3个LED的控制状态&#xff0c;另一个按键是重置当…...

抖音热点视频识别与分片处理机制解析

抖音作为日活数亿的短视频平台,其热点视频识别和分片处理机制是支撑高并发访问的核心技术。以下是抖音热点视频识别与分片的实现方案: 热点视频识别机制 1. 实时行为监控系统 用户行为聚合:监控点赞、评论、分享、完播率等指标的异常增长曲线内容特征分析:通过AI识别视频…...

添加购物车功能

业务需求&#xff1a; 用户提交三个字段&#xff0c;服务端根据提交的字段判断是菜品还是套餐&#xff0c;根据菜品或者套餐添加购物车表中。 代码实现 RestController Slf4j RequestMapping("/user/shoppingCart") public class ShoppingCartController {Autowired…...