【Python笔记-设计模式】代理模式

一、说明

代理模式是一种结构型设计模式,提供对象的替代品或其占位符。代理控制着对于原对象的访问,并允许在将请求提交给对象前后进行一些处理。

(一) 解决问题

控制对对象的访问,或在访问对象前增加额外的功能或控制访问

(二) 使用场景

  1. 远程代理:将对象的访问请求发送给远程服务器,以实现远程对象的访问。这在分布式系统中很常见,可以隐藏远程调用的复杂性。
  2. 虚拟代理:延迟加载对象,即在需要时才真正创建对象。这可以提高系统的性能和资源利用率。
  3. 保护代理:控制对对象的访问,只有满足特定条件的请求才能访问对象。这可以用于实现权限控制等安全功能。
  4. 缓存代理:为昂贵的操作结果提供缓存,以提高系统的性能。当请求相同的操作时,直接返回缓存的结果,避免重复计算。
  5. 智能引用代理:在对象被引用时进行一些额外的操作,例如计算对象的引用次数,当引用次数为0时自动释放对象。

二、结构

  1. 服务接口(ServiceInterface)声明了服务接口。代理必须遵循该接口才能伪装成服务对象。
  2. 服务(Service)类提供了一些实用的业务逻辑。
  3. 代理(Proxy)类包含一个指向服务对象的引用成员变量。代理完成其任务(例如延迟初始化、记录日志、访问控制和缓存等)后会将请求传递给服务对象。通常情况下,代理会对其服务对象的整个生命周期进行管理。
  4. 客户端(Client)能通过同一接口与服务或代理进行交互,所以你可在一切需要服务对象的代码中使用代理。

三、伪代码

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
代理模式例:买演唱会门票时,找黄牛(代理人)代买门票
"""from abc import ABC, abstractmethodclass TicketSeller(ABC):"""抽象主题"""@abstractmethoddef buy_ticket(self) -> None:passclass TrainStationSeller(TicketSeller):"""真实主题"""def buy_ticket(self) -> None:print("官方票务平台出票")class TicketProxy(TicketSeller):"""代理类"""def __init__(self, train_seller: TrainStationSeller) -> None:self._train_station_seller = train_sellerdef buy_ticket(self) -> None:print("黄牛帮助购买演唱会门票")self._train_station_seller.buy_ticket()if __name__ == "__main__":"""黄牛帮助购买演唱会门票官方票务平台出票"""train_station_seller = TrainStationSeller()ticket_proxy = TicketProxy(train_station_seller)ticket_proxy.buy_ticket()

四、优缺点

优点

  • 远程调用的优化:可以将远程调用的开销和实现细节隐藏起来,客户端可以像调用本地对象一样调用远程对象,提高系统的性能和效率。
  • 保护目标对象:可以通过代理类来控制对目标对象的访问,实现权限控制、安全检查等功能,保护目标对象不被非法访问。
  • 延迟加载:可以延迟加载目标对象,只有在真正需要时才创建目标对象,节省了系统资源。

缺点

  • 增加系统复杂性:因为会会引入代理类,可能会导致代码难以理解和维护。
  • 性能损耗:在某些情况下,代理模式可能会引入额外的性能损耗,例如远程代理需要进行网络通信,可能会影响系统的响应速度。

【Python笔记】设计模式-CSDN博客

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

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

相关文章

apidoc接口文档的自动更新与发布

文章目录 一、概述二、环境准备三、接口文档生成1. 下载源码2. 初始化3.执行 四、文档发布五,配置定时运行六,docker运行七,不足与优化分析 一、概述 最近忙于某开源项目的接口文档整理,采用了apidoc来整理生成接口文档。 apidoc…

深度学习系列59:文字识别

1. 简单文本: 使用google加的tesseract,效果不错。 首先安装tesseract,在mac直接brew install即可。 python调用代码: import pytesseract from PIL import Image img Image.open(1.png) pytesseract.image_to_string(img, lan…

MES管理系统生产过程控制的核心要素

MES(制造执行系统)是为优化制造业生产过程和管理而设计的软件系统,其核心要素包括: 工单管理:工单管理是MES系统最基本的功能之一,它可以跟踪和管理各种类型的工单,如生产工单、维修工单和质量…

Spring篇----第六篇

系列文章目录 文章目录 系列文章目录前言一、spring 支持集中 bean scope?二、spring bean 容器的生命周期是什么样的?三、什么是 spring 的内部 bean?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男…

Java EE改名Jakarta EE,jakarta对程序开发的影响

一、前言 很多Java程序员在使用新版本的Spring6或者springboot3版本的时候,发现了一些叫jakarta的包。我在阅读开源工作流引擎camunda源代码的时候,也发展了大量jakarta的工程包。 比如:camunda的webapps编译工程就提供了2种方式javax和jaka…

SCI一区 | Matlab实现ST-CNN-MATT基于S变换时频图和卷积网络融合多头自注意力机制的多特征分类预测

SCI一区 | Matlab实现ST-CNN-MATT基于S变换时频图和卷积网络融合多头自注意力机制的故障多特征分类预测 目录 SCI一区 | Matlab实现ST-CNN-MATT基于S变换时频图和卷积网络融合多头自注意力机制的故障多特征分类预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍…

论文阅读:Ground-Fusion: A Low-cost Ground SLAM System Robust to Corner Cases

前言 最近看到一篇ICRA2024上的新文章,是关于多传感器融合SLAM的,好像使用了最近几年文章中较火的轮式里程计。感觉这篇文章成果不错,代码和数据集都是开源的,今天仔细读并且翻译一下,理解创新点、感悟研究方向、指导…

【杂谈】还能这么骗Github开源者?

起因 StarkNet给Github前5000的账户空投了一波STRK代币,一般有资格获得空投的开发者,大概能获得 110个 STRK 代币,按目前价格计算大概 1500人民币左右。 什么是有资格的开发者呢?按 Starknet要求,如果你给在 GitHub上排名前 5000…

基于SSM的废品买卖回收管理系统(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的废品买卖回收管理系统(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spri…

Vue+SpringBoot打造开放实验室管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实验管理模块2.4 实验设备模块2.5 实验订单模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示五、样例代码5.1 查询实验室设备5.2 实验放号5.3 实验预定 六、免责说明 一、摘…

设计模式-创建型模式-建造者模式

建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。 建造者模式一步一步地创建一个复杂的对象,它允许用户只通过指定复杂对象…

windows 中, bash: conda: command not found(已解决)

git bash 中运行conda命令,出现这种错误,原因是你没有在git bash中 配置conda,导致git bash无法找到conda 那就配置一下,找到你的conda的安装位置下的bash.sh文件,一般在安装位置(我的安装在C盘的自定义路径…

RocketMQ生产环境常见问题分析与总结

RocketMQ生产环境常见问题分析与总结 如何保证消息不丢失 消息丢失场景 对于跨网络的节点可能会丢消息,因为MQ存盘都会先写入OS的PageCache中,然后再让OS进行异步刷盘,如果缓存中的数据未及时写入硬盘就会导致消息丢失 生产端到Broker端Brok…

nc开发刚导入项目eclipse出现莫名其妙的错误,红叉,感叹号,文件missing

解决类出现红叉 解决感叹号,文件missing 其他问题 右上角的视图,要选择java,如果是javaEE也会有一些文件没有展示出来。

2024全国水科技大会暨土壤和地下水污染防治与修复技术创新论坛(七)

论坛召集人:李 辉 上海大学环境与化学工程学院教授 一、会议背景 十四五”时期,我国生态文明建设进入以减污降碳协同增效为重点战略方向,促进经济社会发展全面绿色转型,实现生态环境质量改善由量变到质变的关键时期。聚焦土壤与地…

挑战杯 基于机器学习与大数据的糖尿病预测

文章目录 1 前言1 课题背景2 数据导入处理3 数据可视化分析4 特征选择4.1 通过相关性进行筛选4.2 多重共线性4.3 RFE(递归特征消除法)4.4 正则化 5 机器学习模型建立与评价5.1 评价方式的选择5.2 模型的建立与评价5.3 模型参数调优5.4 将调参过后的模型重…

三、OpenAI之Function Calling实战

黑8决心将对 OpenAI API 的学习应用到更多实际场景中,以展示新时代技术的巨大潜力。在接下来的日子里,他不断探索和尝试,将 API 中的各种功能融入到不同的生活场景中,取得了一系列令人瞩目的成果。 首先,他将 OpenAI …

Chrome插件(二)—Hello World!

本小节将指导你从头到尾创建一个基本的Chrome插件,你可以认为是chrome插件开发的“hello world”! 以下详细描述了各个步骤: 第一步:设置开发环境 确保你拥有以下工具: 文本编辑器:如Visual Studio Cod…

Django学习记录04——靓号管理整合

1.靓号表 1.1 表结构 1.2 靓号表的构造 class PrettyNum(models.Model): 靓号表 mobile models.CharField(verbose_name"手机号", max_length11)# default 默认值# null true,blank true 允许为空price models.IntegerField(verbose_name"价…

EasyRecovery易恢复软件数据恢复方面表现优势有哪些?

EasyRecovery易恢复软件在数据恢复方面表现优异。它支持多种设备的数据恢复,如硬盘、光盘、U盘/移动硬盘、数码相机等,并且能够恢复包括文档、图片、视频、音频等各种类型的文件。无论是误删除、格式化、分区丢失还是硬件故障导致的数据丢失,…