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

 更新时间:2022年02月15日 10:12:46   作者:范桂飓  
这篇文章主要介绍了Python设计模式结构型代理模式,代理模式即Proxy Pattern,为其他对象提供一种代理以控制对这个对象的访问,下文内容详细介绍,具有一定的参考价值,需要的小伙伴可以参考一下

一、代理模式

代理模式,为其他对象提供一种代理,以此控制一个对象的访问方式。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

二、应用场景

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

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

相关文章

  • Python运算符重载用法实例

    Python运算符重载用法实例

    这篇文章主要介绍了Python运算符重载用法,实例分析了Python运算符重载实现加法运算的技巧,需要的朋友可以参考下
    2015-05-05
  • 关于反爬虫的一些简单总结

    关于反爬虫的一些简单总结

    这篇文章主要介绍了关于反爬虫的一些简单总结,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Python 使用csv库处理CSV文件的方法

    Python 使用csv库处理CSV文件的方法

    Python中集成了专用于处理csv文件的库,名为:csv,本文给大家介绍了Python使用csv库处理CSV文件的方法及csv库中4个常用的对象,结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • Django中的Signal代码详解

    Django中的Signal代码详解

    这篇文章主要介绍了Django中的Signal代码详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • python处理“&#”开头加数字的html字符方法

    python处理“&#”开头加数字的html字符方法

    在本篇文章里小编给大家整理了关于python如何处理“&#”开头加数字的html字符的相关知识点总结,有兴趣的朋友们学习下。
    2019-06-06
  • python实现批量修改图片格式和尺寸

    python实现批量修改图片格式和尺寸

    这篇文章主要为大家详细介绍了python实现批量修改图片格式和尺寸的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • 基于Python fminunc 的替代方法

    基于Python fminunc 的替代方法

    今天小编就为大家分享一篇基于Python fminunc 的替代方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • Python中参数打包和解包的实现

    Python中参数打包和解包的实现

    在Python中,打包和解包参数是一种操作方式,可以将多个参数打包成一个元组或字典,也可以将一个元组或字典解包成多个参数,本文就来介绍一下如何使用
    2023-09-09
  • python绘图中的 四个绘图技巧

    python绘图中的 四个绘图技巧

    在可视化数据时,通常需要在单个图形中绘制多个图形。 例如,如果您想从不同的角度可视化相同的变量如:数字变量的并排直方图和箱线图,则多个图形很有用。 在这篇文章中,我分享了绘制多个图形的 4 个简单但实用的技巧,具有一定的参考价值,需要的小伙伴可以参考一下
    2021-12-12
  • 浅谈django的render函数的参数问题

    浅谈django的render函数的参数问题

    今天小编就为大家分享一篇浅谈django的render函数的参数问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10

最新评论