【Python设计模式06】代理模式

代理模式(Proxy Pattern)是一种结构型设计模式,它通过创建代理对象来控制对另一个对象的访问。代理模式可以用于延迟实例化、控制访问权限、记录日志等。代理模式的核心思想是为其他对象提供一种代理,以控制对这个对象的访问。

代理模式的结构

代理模式主要包括以下几个角色:

  1. 抽象主题(Subject):定义代理类和真实类的共同接口。
  2. 真实主题(RealSubject):实现抽象主题接口,是真正需要使用的对象。
  3. 代理(Proxy):实现抽象主题接口,并持有对真实主题对象的引用。

代理模式的类型

代理模式有多种类型,包括:

  1. 远程代理:为一个位于不同地址空间的对象提供代理,隐藏实际对象的存在。
  2. 虚拟代理:根据需要创建开销大的对象,进行延迟实例化。
  3. 保护代理:控制对原始对象的访问,保护其不被随意访问和修改。
  4. 智能引用代理:在访问对象时,提供额外的操作,如引用计数、日志记录等。

示例

以下示例展示了一个虚拟代理的实现,用于延迟实例化开销大的对象。

定义抽象主题和真实主题
python 复制代码
from abc import ABC, abstractmethod

class Image(ABC):
    @abstractmethod
    def display(self):
        pass

class RealImage(Image):
    def __init__(self, filename: str):
        self.filename = filename
        self.load_image_from_disk()

    def load_image_from_disk(self):
        print(f"Loading {self.filename}")

    def display(self):
        print(f"Displaying {self.filename}")
定义代理类
python 复制代码
class ProxyImage(Image):
    def __init__(self, filename: str):
        self.filename = filename
        self.real_image = None

    def display(self):
        if self.real_image is None:
            self.real_image = RealImage(self.filename)
        self.real_image.display()
使用代理类
python 复制代码
def main():
    image = ProxyImage("test_image.jpg")

    # 图像尚未加载
    print("Image will be displayed now:")
    image.display()  # 加载并显示图像

    # 图像已加载,不需要再次加载
    print("\nImage will be displayed again:")
    image.display()  # 直接显示图像

if __name__ == "__main__":
    main()

在这个示例中,Image是抽象主题,RealImage是具体主题,实现了图像的加载和显示。ProxyImage是代理类,通过延迟实例化的方式,控制对RealImage对象的访问。在第一次调用display方法时,代理类会实例化RealImage对象并加载图像,后续调用则直接显示图像而不需要重新加载。

代理模式的优缺点

优点
  1. 控制对象访问:通过代理类,可以控制对真实对象的访问权限和方式。
  2. 延迟加载:虚拟代理可以延迟实例化开销大的对象,提高系统性能。
  3. 增强功能:智能引用代理可以在访问对象时增加额外的操作,如日志记录、性能监控等。
缺点
  1. 增加复杂性:引入代理模式会增加系统的复杂性,增加类的数量。
  2. 性能开销:代理模式可能会引入额外的性能开销,特别是在代理类和真实类之间的转换较频繁时。

代理模式的适用场景

  1. 远程代理:为位于不同地址空间的对象提供本地代理,以隐藏实际对象的存在。
  2. 虚拟代理:根据需要创建开销大的对象,进行延迟实例化。
  3. 保护代理:控制对原始对象的访问,保护其不被随意访问和修改。
  4. 智能引用代理:在访问对象时,提供额外的操作,如引用计数、日志记录等。

总结

代理模式是一种结构型设计模式,通过代理对象控制对真实对象的访问。代理模式可以用于延迟实例化、控制访问权限、记录日志等。通过合理应用代理模式,可以提高系统的灵活性和可扩展性,同时也需要注意代理模式可能带来的复杂性和性能开销。代理模式在实际开发中有着广泛的应用,理解并熟练掌握这一模式,有助于构建高效、可维护的系统。

相关推荐
BK贝壳5 小时前
亿级用户签到位图选型复盘:用 bool-hybrid-array 扛冷启动打卡,也把它和 Roaring/Redis 的边界测清楚了
数据结构·python·性能优化·numpy
2601_966949657 小时前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
在世修行11 小时前
智学文枢:页面切换与跨页数据预填
python·桌面应用·signal·1024程序员节·pyside·跨页跳转·状态预填
知守观11 小时前
设计模式实战:从真实老项目中看标准模板方法与工厂的落地
java·spring·设计模式
2601_9628857211 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
打工仔折腾 AI11 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
信誓旦旦的程序猿12 小时前
【Python量化实战宝典 #21】北向资金跟随手册:聪明钱择时信号(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
严谨的麻辣烫12 小时前
静态 ISP 代理请求超时怎么排查?Python 与 curl 实战
python·http·requests·1024程序员节·网络排障
\光辉岁月/14 小时前
3.spring5-AOP
spring·代理模式·aop·spring5
KeepRobots14 小时前
11-01 温哥华不回拨:用 60 行 Python 查你的工单系统会不会差一小时(KeepRobots 工程笔记)
python