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

设计模式-结构型-代理模式

1. 代理模式概述

代理模式(Proxy Pattern) 是一种结构型设计模式,它允许通过代理对象来控制对目标对象的访问。代理模式主要用于以下场景:

  • 控制对象访问:限制某些对象的访问权限,例如权限控制。

  • 延迟实例化:在真正需要使用对象时才创建,以优化性能。

  • 记录日志或监控:在访问对象时增加额外的功能,如日志、统计。

  • 远程代理:提供访问远程对象的接口,如RPC、Web服务。

代理模式的主要角色:

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

  • RealSubject(真实对象):实际执行操作的对象。

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


2. 代理模式的分类

代理模式可以分为以下几种类型:

  • 静态代理:在编译期就确定代理类。

  • 动态代理:在运行时动态生成代理对象。

  • 远程代理:为远程对象提供本地代理。

  • 虚拟代理:按需创建对象,延迟初始化。

  • 保护代理:控制对对象的访问权限。


3. 代理模式的 Python 实现

3.1 静态代理

静态代理需要手动编写代理类,适用于代理逻辑固定的情况。

class Subject:"""抽象主题类"""def request(self):passclass RealSubject(Subject):"""真实对象"""def request(self):print("真实对象的请求被执行")class Proxy(Subject):"""代理类"""def __init__(self, real_subject):self._real_subject = real_subjectdef request(self):print("代理对象:检查权限")self._real_subject.request()print("代理对象:记录日志")# 使用代理
real_subject = RealSubject()
proxy = Proxy(real_subject)
proxy.request()

3.2 动态代理(基于 functools.wraps

动态代理可以使用 Python 的装饰器实现,在运行时增强功能。

import functoolsdef proxy_decorator(func):@functools.wraps(func)def wrapper(*args, **kwargs):print("代理:执行前的操作(如权限检查、日志记录)")result = func(*args, **kwargs)print("代理:执行后的操作(如缓存、监控)")return resultreturn wrapperclass Service:"""一个需要代理的服务类"""@proxy_decoratordef operation(self):print("执行真实服务逻辑")# 使用动态代理
service = Service()
service.operation()

3.3 虚拟代理(延迟初始化)

虚拟代理用于在需要时才创建真实对象,以优化资源使用。

class RealService:"""真实对象"""def __init__(self):print("初始化真实对象...")def operation(self):print("执行真实对象的操作")class VirtualProxy:"""虚拟代理类"""def __init__(self):self._real_service = Nonedef operation(self):if self._real_service is None:self._real_service = RealService()  # 延迟初始化self._real_service.operation()# 使用虚拟代理
proxy = VirtualProxy()
proxy.operation()
proxy.operation()  # 第二次调用不会重新初始化

4. 代理模式的优缺点

优点:

控制对象访问:可以限制用户直接访问敏感对象。

增强功能:可以在不修改原代码的情况下添加额外逻辑,如日志、权限检查。

优化性能:使用虚拟代理可以延迟对象初始化,减少资源消耗。

支持远程访问:远程代理模式可以封装远程调用的细节。

缺点:

增加代码复杂度:代理模式需要额外的代理类,使代码结构变得更复杂。

可能影响性能:对于高频调用的情况,代理可能会引入额外的开销。


5. 适用场景

代理模式适用于以下场景:

  • 权限控制:如用户访问系统资源时需要权限验证。

  • 日志和监控:如 API 调用时记录日志,收集访问数据。

  • 远程调用:如分布式系统中的 RPC 代理。

  • 缓存代理:如访问数据库或网络时,使用缓存代理减少开销。

  • 防火墙代理:如限制对特定网站或 API 的访问。


6. 总结

代理模式是一种重要的设计模式,能够在不改变原对象的情况下,控制其访问并增强其功能。在 Python 中,我们可以使用静态代理、动态代理(装饰器)或虚拟代理来实现不同的需求。

何时使用代理模式?

  • 需要控制对对象的访问,如权限管理。

  • 需要在对象调用前后增加额外功能,如日志、监控。

  • 需要延迟加载对象,减少初始化成本。

相关文章:

设计模式-结构型-代理模式

1. 代理模式概述 代理模式(Proxy Pattern) 是一种结构型设计模式,它允许通过代理对象来控制对目标对象的访问。代理模式主要用于以下场景: 控制对象访问:限制某些对象的访问权限,例如权限控制。 延迟实例…...

FCC CE SRRC MIC是什么意思?

1.FCC CE SRRC MIC是什么意思&#xff1f; 2.4000 GHz 至 2.4835 GHz&#xff1a;<33 dBm&#xff08;FCC&#xff09;&#xff0c;<20 dBm&#xff08;CE/SRRC/MIC&#xff09; 5.150 GHz 至 5.250 GHz&#xff08;CE&#xff1a;5.170 GHz 至 5.250 GHz&#xff09;&a…...

springboot005学生心理咨询评估系统(源码+数据库+文档)

源码地址&#xff1a;学生心理咨询评估系统 文章目录 1.项目简介2.部分数据库结构与测试用例3.系统功能结构4.包含的文件列表&#xff08;含论文&#xff09;后台运行截图 1.项目简介 ​ 使用旧方法对学生心理咨询评估信息进行系统化管理已经不再让人们信赖了&#xff0c;把现…...

Apache Doris:一款高性能的实时数据仓库

Apache Doris 是一款基于 MPP 架构的高性能、实时分析型数据库。它以高效、简单和统一的特性著称&#xff0c;能够在亚秒级的时间内返回海量数据的查询结果。Doris 既能支持高并发的点查询场景&#xff0c;也能支持高吞吐的复杂分析场景。 Apache Doris 最初是百度广告报表业务…...

使用Vue-Flow创建一个流程图可视化节点坐标查询器

在开发中遇到这样一个需求&#xff0c;需要后端返回数据前端网页生成流程图&#xff0c;由于流程图使用了Vue-Flow&#xff0c;所以需要坐标来辅助后端生成数据。 首先引入方法并定义添加节点数据 const { updateEdge, addEdges, addNodes} useVueFlow() const add_nodes …...

面试基础--Java 集合框架详解

Java 集合框架详解&#xff1a;从 ArrayList 到 HashMap 的底层原理 引言 在 Java 开发中&#xff0c;集合框架&#xff08;Collection Framework&#xff09;是处理数据存储和操作的核心工具。无论是日常开发还是大厂面试&#xff0c;对集合框架的理解都是考察的重点之一。本…...

轻量级日志管理平台Grafana Loki

文章目录 轻量级日志管理平台Grafana Loki背景什么是Loki为什么使用 Grafana Loki&#xff1f;架构Log Storage Grafana部署使用基于 Docker Compose 安装 LokiMinIO K8s集群部署Loki采集Helm 部署方式和案例 参考 轻量级日志管理平台Grafana Loki 背景 在微服务以及云原生时…...

回文串

长度为偶数的串&#xff0c;重排连续字串变成回文串。 Problem - D - Codeforces 代码&#xff1a; #include <bits/stdc.h> #define fi first #define se second using namespace std; typedef long long LL; typedef pair<int,int> PII; typedef pair<LL,L…...

《跟李沐学 AI》AlexNet论文逐段精读学习心得 | PyTorch 深度学习实战

前一篇文章&#xff0c;使用 AlexNet 实现图片分类 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于学习 9年后重读深度学习奠基作之一&#xff1a;AlexNet【下】【论文精读】】的心得。 《跟李沐…...

【电机控制器】FU6832S——持续更新

【电机控制器】FU6832S——持续更新 文章目录 [TOC](文章目录) 前言一、ADC二、UART三、PWM四、参考资料总结 前言 使用工具&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、ADC 二、UART 三、PWM 四、参考资料 总结 本文仅仅简…...

Flutter屏幕适配终极方案:flutter_screenutil深度解析

在跨平台应用开发中&#xff0c;屏幕适配始终是开发者面临的核心挑战。Flutter虽然自带响应式布局体系&#xff0c;但面对复杂的设计稿标注时&#xff0c;手动计算比例效率低下。今天我们将深度解析目前Flutter社区最受欢迎的屏幕适配方案——flutter_screenutil&#xff0c;手…...

计算机视觉算法实战——产品分拣(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ 1. 领域简介✨✨ 产品分拣是工业自动化和物流领域的核心技术&#xff0c;旨在通过机器视觉系统对传送带上的物品进行快速识别、定位和分类&a…...

可视化报表

根据你的需求&#xff0c;以下是一些可以实现报表可视化的开源项目&#xff0c;这些项目提供了类似阿里巴巴 FBI 报表的功能&#xff0c;支持数据可视化、报表设计、仪表盘和大屏展示等功能&#xff1a; 1. DataEase DataEase 是一个开源的 BI 工具&#xff0c;帮助用户快速分…...

基于模块联邦的微前端架构:重构大型前端应用的模块化边界

引言&#xff1a;企业级前端的模块化困境 字节跳动广告系统采用Webpack 5模块联邦后&#xff0c;主应用构建时间从14分钟降至38秒&#xff0c;微应用独立发布频率提升至每天50次。在动态加载机制下&#xff0c;首屏资源加载体积减少79%&#xff0c;跨团队组件复用率达到92%。其…...

Android之图片保存相册及分享图片

文章目录 前言一、效果图二、实现步骤1.引入依赖库2.二维码生成3.布局转图片保存或者分享 总结 前言 其实现在很多分享都是我们自定义的&#xff0c;更多的是在界面加了很多东西&#xff0c;然后把整个界面转成图片保存相册和分享&#xff0c;而且现在分享都不需要第三方&…...

Linux放行端口

8080这个端口测试看telnet是不通的&#xff0c;您服务器内是否有对应的业务监听了这个端口呢&#xff1f;您到服务器内执行下&#xff1a; netstat -nltp |grep 8080 同时服务器内执行下&#xff1a; systemctl status firewalld iptables -nL 截图反馈下&#xff0c;我看下防火…...

Spring Boot延迟执行实现

说明&#xff1a;本文介绍如何在Spring Boot项目中&#xff0c;延迟执行某方法&#xff0c;及讨论延迟执行方法的是事务问题。 搭建Demo 首先&#xff0c;创建一个Spring Boot项目&#xff0c;pom.xml如下&#xff1a; <?xml version"1.0" encoding"UTF-…...

npm i 失败权限问题

安装完node之后, 测试全局安装一个最常用的 express 模块进行测试 失败&#xff0c;但是用管理员权限打开cmd 安装就成功。 报错如下&#xff1a; npm ERR! If you believe this might be a permissions issue, please double-check the npm ERR! permissions of the file and …...

uniapp 微信小程序打包之后vendor.js 主包体积太大,解决办法,“subPackages“:true设置不生效

现在是打包的时候&#xff0c;vendor.js 的内容全部打到了主包里面&#xff0c; 说一下我的方法&#xff1a; 1. 通过发行 小程序打包 这样打包的体积是最小的&#xff0c;打包之后打开微信开发工具&#xff0c;然后再上传 2.manifest.json,在“mp-weixin”里添加代码 "…...

23.2、云计算安全机制与案例分析

目录 云计算安全保护机制与技术方案云计算安全保护机制与技术方案常见云计算网络安全机制云计算安全管理与运维云计算安全综合应用案例分析 - 阿里云云计算安全综合应用案例分析 - 腾讯云云计算安全综合应用案例分析 - 华为云 云计算安全保护机制与技术方案 首先针对云计算&am…...

游戏引擎学习第120天

仓库:https://gitee.com/mrxiao_com/2d_game_3 上次回顾&#xff1a;周期计数代码 我们正在进行一个项目的代码优化工作&#xff0c;目标是提高性能。当前正在优化某个特定的代码片段&#xff0c;已经将其执行周期减少到48个周期。为了实现这一目标&#xff0c;我们设计了一个…...

将DeepSeek接入vscode的N种方法

接入deepseek方法一:cline 步骤1:安装 Visual Studio Code 后,左侧导航栏上点击扩展。 步骤2:搜索 cline,找到插件后点击安装。 步骤3:在大模型下拉菜单中找到deep seek,然后下面的输入框输入你在deepseek申请的api key,就可以用了 让deepseek给我写了一首关于天气的…...

【知识】PyTorch中不同优化器的特点和使用

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 1. SGD&#xff08;随机梯度下降&#xff09; 2. Adam&#xff08;自适应矩估计&#xff09; 3. AdamW 4. Adagrad 5. Adadelta 6. Adafact…...

ubuntu windows双系统踩坑

我有个台式机&#xff0c;先安装的ubuntu&#xff0c;本来想专门用来做开发&#xff0c;后面儿子长大了&#xff0c;给他看了一下星际争霸、魔兽争霸&#xff0c;立马就迷上了。还有一台windows的笔记本&#xff0c;想着可以和他联局域网一起玩&#xff0c;在ubuntu上用wine跑魔…...

AI智算-k8s+SGLang实战:DeepSeek-r1:671b满血版多机多卡私有化部署全攻略

k8sSGLang实战&#xff1a;DeepSeek-r1:671b满血版多机多卡私有化部署全攻略 前言环境准备1. 模型下载2.软硬件环境介绍 正式部署1. 部署LWS API2. 通过 LWS 部署DeepSeek-r1模型3. 查看显存占用情况4. 服务对外暴露5. 测试部署效果5.1 通过 curl5.2 通过 OpenWebUIa. 部署 Ope…...

zlib编译https://www.cnblogs.com/MrOuqs/p/5751485.html

vs2015零基础编译zlib从失败到成功 vs2015零基础编译zlib从失败到成功_zlib vs2015-CSDN博客 c如何将文件夹打包成zip...

【蓝桥杯单片机】第十三届省赛第二场

一、真题 二、模块构建 1.编写初始化函数(init.c) void Cls_Peripheral(void); 关闭led led对应的锁存器由Y4C控制关闭蜂鸣器和继电器 2.编写LED函数&#xff08;led.c&#xff09; void Led_Disp(unsigned char ucLed); 将ucLed取反的值赋给P0 开启锁存器 关闭锁存…...

【安装及调试旧版Chrome + 多版本环境测试全攻略】

&#x1f468;&#x1f4bb; 安装及调试旧版Chrome 多版本环境测试全攻略 &#x1f310; &#xff08;新手友好版 | 覆盖安装/运行/调试全流程&#xff09; &#x1f570;️ 【背景篇】为什么我们需要旧版浏览器测试&#xff1f; &#x1f30d; &#x1f310; 浏览器世界的“…...

从零开始玩转TensorFlow:小明的机器学习故事 5

图像识别的挑战 1 故事引入&#xff1a;小明的“图像识别”大赛 小明从学校里听说了一个有趣的比赛&#xff1a;“美食图像识别”。参赛者需要训练计算机&#xff0c;看一张食物照片&#xff08;例如披萨、苹果、汉堡等&#xff09;&#xff0c;就能猜出这是什么食物。听起来…...

sql的索引与性能优化相关

之前面试的时候&#xff0c;由于在简历上提到优化sql代码&#xff0c;老是会被问到sql索引和性能优化问题&#xff0c;用这个帖子学习记录一下。 1.为什么要用索引 ------------------------------------------------------------------------------------------------------…...