代理模式

内容:为其他对象提供一种代理以控制对这个对象的访问。

应用场景:

  • 远程代理:为远程的对象提供代理
  • 虚代理:根据需要创建很大的对象
  • 保护代理:控制对原始对象的访问,用于对象有不同访问权限时

代理模式(Proxy Pattern)是一种结构型设计模式,它允许通过代理对象控制对另一个对象的访问。

代理模式涉及以下几个角色:

  1. 抽象主题(Subject):定义了真实主题和代理主题的共同接口,这样在使用代理的地方就可以使用真实主题或代理主题,实现了客户端与真实主题之间的松耦合。
  2. 真实主题(Real Subject):定义了代理所代表的真实对象,是实际执行业务逻辑的对象。
  3. 代理(Proxy):保存一个引用,使得代理可以访问真实主题,并提供一个与真实主题接口相同的接口,以便可以使用代理替代真实主题。

客户端通过代理对象间接地访问真实主题,可以在代理中添加额外的逻辑,例如访问控制、缓存、延迟加载等,而无需修改真实主题。代理模式可以提供更高层次的控制和保护,同时隐藏了真实主题的复杂性。

from abc import ABCMeta, abstractmethod


class Subject:

    @abstractmethod
    def get_content(self):
        pass

    @abstractmethod
    def set_content(self, content):
        pass


class RealSubject(Subject):

    def __init__(self, file_name):
        self.file_name = file_name
        print("读取文件内容")
        with open(file_name, "r", encoding="utf-8") as f:
            self.content = f.read()

    def get_content(self):
        print(self.content)
        return self.content

    def set_content(self, content):
        with open(self.file_name, "rw", encoding="utf-8") as f:
            f.write(content)


class VirtualSubject(Subject):

    def __init__(self, file_name):
        self.file_name = file_name
        self.subject = None

    def get_content(self):
        if not self.subject:
            self.subject = RealSubject(self.file_name)
        return self.subject.get_content()

    # def set_content(self, content):
    #     if not self.subject:
    #         self.subject = RealSubject(self.file_name)
    #     return self.subject.set_content(content)

    # 可以进行加密
    def set_content(self, content):
        raise PermissionError("no permission")


r = RealSubject("test.txt")

v = VirtualSubject("test.txt")
v.get_content()


# 抽象主题
class Subject:
    def request(self):
        pass


# 真实主题
class RealSubject(Subject):
    def request(self):
        print("执行真实主题的请求")


# 代理
class Proxy(Subject):
    def __init__(self):
        self.real_subject = RealSubject()

    def request(self):
        # 在访问真实主题前可以添加额外的逻辑
        print("执行代理的请求")
        self.real_subject.request()
        # 在访问真实主题后可以添加额外的逻辑


# 客户端代码
subject = Proxy()
subject.request()

results matching ""

    No results matching ""