Python结构型设计模式:代理模式详解与应用

Chloe
Chloe
发布时间:2026-10-15 | 4人浏览过
原创

本文深入解析Python中的结构型设计模式——代理模式。通过远程、虚拟、保护及智能引用四种典型场景,阐述如何利用代理对象控制对真实对象的访问。文章结合Python代码示例,详细演示抽象角色、真实角色与代理角色的实现方式,帮助开发者理解延迟加载、权限控制等核心应用技巧。

一、代理模式

代理模式的核心在于为其他对象提供一个代理,从而控制对该对象的访问。当某个对象因各种原因不适合或无法被直接引用时,代理对象便作为客户端与目标对象之间的中介发挥作用。

二、应用场景

远程代理(Remote Proxy):为位于不同地址空间的对象提供一个本地代表。该地址空间既可以是本机,也可以是另一台服务器。远程代理也被称为大使(Ambassador)。其优势在于隐藏了网络通信的细节,使客户端无需关心网络存在。

虚拟代理(Virtual Proxy):用于创建资源消耗较大的对象,并确保该对象仅在真正需要时才被实例化,例如图片的延迟加载。虚拟代理的好处在于可以按需加载被代理对象,并对加载过程进行必要的优化。当模块加载极其耗费资源时,虚拟代理的优势尤为显著。

保护代理(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("修改内容...")  # 保护代理这里不能进行修改,会报错。

到此这篇关于Python设计模式结构型代理模式的文章就介绍到这了,更多相关Python代理模式内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表