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

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

何时使用代理模式?

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

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

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

相关推荐
老白干1 小时前
jjwt 0.9.1 在 JDK 11+ 上的两个“坑”与完整解决方案
java·python·log4j
笨鸟先飞,勤能补拙8 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
长和信泰光伏储能9 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
浦信仿真大讲堂9 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
Gu Gu Study10 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
卷无止境10 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境10 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd12310 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy123931021611 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb0012 小时前
一个项目带你入门AI应用开发01
python