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

作者:范桂飓 时间:2023-06-30 19:23:58 

一、代理模式

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

二、应用场景

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

来源:https://is-cloud.blog.csdn.net/article/details/122930242

标签:Python,设计模式,代理模式
0
投稿

猜你喜欢

  • 注意:php5.4删除了session_unregister函数

    2023-11-24 12:31:54
  • linux CentOS 7.4下 mysql5.7.20 密码改回来的处理方法

    2024-01-25 17:36:56
  • 详解在spring中使用JdbcTemplate操作数据库的几种方式

    2024-01-29 09:29:50
  • vue封装一个弹幕组件详解

    2024-05-09 15:28:38
  • 探究数组排序提升Python程序的循环的运行效率的原因

    2021-07-16 21:35:06
  • Python SVM(支持向量机)实现方法完整示例

    2021-06-09 14:20:34
  • python文件读写操作与linux shell变量命令交互执行的方法

    2022-10-24 06:37:55
  • Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)

    2022-03-02 16:50:47
  • Jsp生成页面验证码的方法[附代码]

    2023-06-25 07:46:42
  • golang架构设计开闭原则手写实现

    2023-07-21 22:01:36
  • Caffe卷积神经网络视觉层Vision Layers及参数详解

    2023-02-28 02:06:41
  • PL/SQL Dev连接Oracle弹出空白提示框的解决方法分享

    2024-01-28 03:19:05
  • python中的map函数语法详解

    2021-04-29 22:07:00
  • DW表格应用之细线框的制作

    2008-02-03 19:00:00
  • layui表单提交到后台自动封装到实体类的方法

    2024-04-22 22:33:11
  • Windows下安装python2和python3多版本教程

    2021-06-06 07:10:59
  • Python文件处理

    2022-08-08 10:22:01
  • 详解在Python程序中自定义异常的方法

    2021-05-17 00:34:28
  • 小谈访客浏览器分辨率

    2007-10-18 13:12:00
  • 基于python实现FTP文件上传与下载操作(ftp&sftp协议)

    2021-11-03 00:11:26
  • asp之家 网络编程 m.aspxhome.com