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

1. 代理模式概述

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

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

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

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

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

代理模式的主要角色:

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

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

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


2. 代理模式的分类

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

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

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

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

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

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


3. 代理模式的 Python 实现

3.1 静态代理

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

复制代码
class Subject:
    """抽象主题类"""
    def request(self):
        pass

class RealSubject(Subject):
    """真实对象"""
    def request(self):
        print("真实对象的请求被执行")

class Proxy(Subject):
    """代理类"""
    def __init__(self, real_subject):
        self._real_subject = real_subject

    def request(self):
        print("代理对象:检查权限")
        self._real_subject.request()
        print("代理对象:记录日志")

# 使用代理
real_subject = RealSubject()
proxy = Proxy(real_subject)
proxy.request()

3.2 动态代理(基于 functools.wraps**)**

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

复制代码
import functools

def proxy_decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print("代理:执行前的操作(如权限检查、日志记录)")
        result = func(*args, **kwargs)
        print("代理:执行后的操作(如缓存、监控)")
        return result
    return wrapper

class Service:
    """一个需要代理的服务类"""
    @proxy_decorator
    def 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 = None

    def 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 中,我们可以使用静态代理、动态代理(装饰器)或虚拟代理来实现不同的需求。

何时使用代理模式?

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

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

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

相关推荐
“AI国潮设计-小江”7 小时前
《Python+SDXL实战:用ControlNet精准控制“英歌舞翻糖吐司”构图,附批量生成脚本》
开发语言·人工智能·python·prompt·aigc
wenwen_chao7 小时前
Python学习与开发资源合集:实用技巧与工具推荐
python
for_ever_love__8 小时前
函数——参数、lambda、*args与作用域
python·函数·大模型开发·编程基础
东莞市云毅网络有限公司8 小时前
企业资料时效性判定:Last-Modified、正文日期与版本字段三路交叉
python·sqlite·自动化运维·geo·数据监测
Query*8 小时前
深入浅出LangGraph【一】_基础篇
python·ai·langchain
XiaoMaqqqq8 小时前
市面上正规的IP驱动产业新场景新工具哪家强
运维·python·网络协议·tcp/ip
ShyanZh9 小时前
【Python3基础】19-Socket 与 TCP、UDP 编程
python·网络协议·tcp/ip·udp
惊讶的猫10 小时前
工具选对之后还不够:商城 Agent 的参数与权限治理
开发语言·python
天赐范式10 小时前
天赐范式第186天:让方差开始自洽——Bulmer效应的闭式验证
python·数字生命·天赐范式·动态运行时·遗传方差·bulmer效应
泡茶喝茶写代码10 小时前
A股量化数据工程:从 REST 接口到策略信号(第 8 篇):成长能力因子:营收与利润增速
java·python·股票数据api·股票数据api接口·股票量化数据api·股票量化数据接口·股票数据api数据