Python设计模式结构型代理模式
作者:范桂飓 发布时间:2023-06-30 19:23:58
标签:Python,设计模式,代理模式
一、代理模式
代理模式,为其他对象提供一种代理,以此控制一个对象的访问方式。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
二、应用场景
远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,也可是在另一台机器中。远程代理又叫做大使(Ambassador
)。好处是系统可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。
虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建,例如:图片延迟加载。使用虚拟代理模式的好处就是代理对象可以在必要的时候才将被代理的对象加载;代理可以对加载的过程加以必要的优化。当一个模块的加载十分耗费资源的情况下,虚拟代理的好处就非常明显。
保护代理(Protection Proxy ):控制对原始对象的访问。保护代理用于对象应该有不同 的访问权限的时候。
智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。
三、代码示例
实体角色:
抽象角色(Subject):通过接口或抽象类声明真实角色实现的业务方法。
真实角色(Real Subject):实现了抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
代理角色(Proxy):实现了抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
import abc
# 抽象角色
class Subject(metaclass=abc.ABCMeta):
@abc.abstractmethod
def get_content(self):
pass
@abc.abstractmethod
def set_content(self, content):
pass
# 真实角色
class RealSubject(Subject):
def __init__(self, filename):
self.filename = filename
f = open(self.filename, "r", encoding="utf-8")
self.content = f.read()
print("读取文件...")
f.close()
def get_content(self):
return self.content
def set_content(self, content):
f = open(self.filename, "w", encoding="utf-8")
f.write(content)
f.close()
# 虚代理
class VirtualProxy(Subject):
def __init__(self, filename):
self.filename = filename
self.subj = None
def get_content(self):
if not self.subj:
self.subj = RealSubject(self.filename)
return self.subj.get_content()
def set_content(self, content):
if not self.subj:
self.subj = RealSubject(self.filename)
return self.subj.set_content(content)
# 保护代理
class ProtectedProxy(Subject):
def __init__(self, filename):
self.filename = filename
self.subj = RealSubject(self.filename)
def get_content(self):
return self.subj.get_content()
def set_content(self, content):
raise PermissionError("您的权限不够!")
if __name__ == "__main__":
print("--- RealSubject ---")
subj = RealSubject("test.txt") # 在这里就会读取文件,并占用内存。
print(subj.get_content())
#subj.set_content("修改内容...")
print("--- VirtualProxy ---")
subj = VirtualProxy("test.txt") # 虚代理只有在调用 get_content 时才会读取文件,并占用内存。
#print(subj.get_content())
#subj.set_content("修改内容...")
print("--- ProtectedProxy ---")
subj = ProtectedProxy("test.txt")
#print(subj.get_content())
#subj.set_content("修改内容...") # 保护代理这里不能进行修改,会报错。
来源:https://is-cloud.blog.csdn.net/article/details/122930242


猜你喜欢
- 本文实例讲述了jQuery自适应轮播图插件Swiper用法。分享给大家供大家参考,具体如下:运行效果截图如下:示例代码如下:<!DOC
- Python 使用tf-idf算法计算文档关键字权重,并生成词云1. 根据tf-idf计算一个文档的关键词或者短语:代码如下:注意需要安装p
- 本文实例讲述了js实现兼容性好的微软官网导航下拉菜单效果。分享给大家供大家参考。具体如下:这是一款微软官网导航菜单,兼容好的下拉菜单,微软官
- torch.autograd.backward(variables, grad_variables=None, retain_graph=N
- 1 什么是 NumpyNumPy,是 Numerical Python 的简称,用于高性能科学计算和数据分析的基础包,像数学科学工具(pan
- ROW_NUMBER()说明:返回结果集分区内行的序列号,每个分区的第一行从 1 开始。语法:ROW_NUMBER () OVER ( [
- 前言本文主要介绍了关于Python+selenium自动化环境搭建的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧
- Oracle的系统要求企业版:CPU最低PENTIUM200M推荐PENTIUMIII1G以上 内存最低128M推荐512M 硬盘空间系统盘
- 包含Contains(s,substr string) bool判断s是否包含substr true:包含 false:不包含例子: &nb
- 在MySQL 8.0.16版本中安装可能会出现部分错误提示已经不使用“UTF8B3”而是使用了“UTF8B4”#//////////////
- 1.字典的概念字典和列表类似,也是可变序列,不过和列表不同,它是无序的可变序列,保存的内容是以键值对(key:value)形式存放的 字典的
- 卸载MariaDBCentOS7默认安装MariaDB而不是MySQL,而且yum服务器上也移除了MySQL相关的软件包。因为MariaDB
- 今天为大家介绍一下python中与class 相关的知识……获取对象的类名python是一门面向对象的语言,对于一切接对象的pyt
- 实战场景初学 Python 爬虫,十之八九大家采集的目标是网页,因此快速定位到网页内容,就成为我们面临的第一道障碍,本篇博客就为你详细说明最
- 在 Django 模板中遍历复杂数据结构的关键是句点字符 (.)。最好是用几个例子来说明一下。 比如,假设你要向模板传递一个 Python
- Sodium 扩展在 PHP7.2 后是跟随 PHP 源码一起发布的,只需要在编译的时候加上 --with-sodium 即可安装成功。如果
- 本文实例为大家分享了python实现简单俄罗斯方块游戏的具体代码,供大家参考,具体内容如下import pygame,sys,random,
- 目录四种参数仅限关键字参数内省中的函数参数函数注解四种参数Python函数func定义如下:def func(first, *args, s
- 笔者在今天的工作中,遇到了一个需求,那就是如何将Python字符串生成PDF。比如,需要把Python字符串‘这是测试文件'生成为P
- 我就废话不多说了,直接上代码吧!def _int_iter(): """根据回文数的定义。首先生成