【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,一经查实,立即删除!

相关文章

[c++] public, private, protected, friend

权限管理是 c 的一大特点,面向对象语言封装的特性也给权限管理带了了方便。c 中的权限主要有 3 种:public,private,protected。类中的函数和属性默认是 private 的,类的继承关系默认也是 private 的。 public&#xf…

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系统最基本的功能之一,它可以跟踪和管理各种类型的工单,如生产工单、维修工单和质量…

解释 C++ 中的虚拟继承(Virtual Inheritance)

解释 C 中的虚拟继承(Virtual Inheritance) 在 C 中,虚拟继承(Virtual Inheritance)是一种特殊的继承方式,用于解决多继承带来的菱形继承(Diamond Inheritance)问题。虚拟继承主要通…

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…

【精选】网络安全大厂面试题 2.0

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏…

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

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

Spring Boot+ShardingSphere+MySQL实现分库分表:高效数据库扩展

在构建现代Web应用程序时,数据库的性能和可扩展性是至关重要的。当应用程序的数据量逐渐增加时,传统的单一数据库可能无法满足需求。分库分表是一种有效的数据库水平扩展方法,可以显著提高数据库性能并实现负载均衡。 什么是分库分表 分库分…

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 实验预定 六、免责说明 一、摘…

数据库-数据库设计-社交关系

佛 每有一个新方案,就要考虑有什么影响增删改查可扩展性 MySQL 根据ER图设计表 create table follow(id bigint unsigned not null auto_increment comment 主键,gmt_create datetime null default current_timestamp,gmt_modified null default current_timest…

hive表中导入数据 多种方法详细说明

文章中对hive表中导入数据 方法目录 方式一:通过load方式加载数据 方式二:直接向分区表中插入数据 方式三:查询语句中创建表并加载数据(as select) 方式四:创建表时通过location指定加载数据路径 1. 创建表…

真值表,主析取范式,主合取范式,栈,哈希表

利用栈对表达式求值 根据运算符的各运算符的优先顺序,确定入栈操作 if(compare(s2.top(),s[i])-1)栈内的优先级小,栈外的运算符入栈if(compare(s2.top(),s[i])0)栈内的优先级与栈外的优先级相同,栈内运算符出栈if(compare(s2.top(),s[i]1)栈…

人工智能机器视觉、大数据与向量数据库的交融之路

文章目录 人工智能机器视觉、大数据与向量数据库的交融之路引言计算机视觉发展现状与趋势技术演进历程回顾当前的主要发展方向 大数据与计算机视觉的相互关系数据驱动下的CV技术进步向量数据库在图像检索与分析中的作用 具体应用案例剖析如何利用大数据和向量数据库解决CV难题代…

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

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

LeetCode 1393.股票的资本损益

Stocks 表: ---------------------- | Column Name | Type | ---------------------- | stock_name | varchar | | operation | enum | | operation_day | int | | price | int | ---------------------- (stock_name, day) 是这张表的主键(具有唯一值的列的组合) …