• 内容:为其他对象提供一种代理以控制对这个对象的访问。
    • 角色:
      • 抽象实体(Subject)
      • 实体(RealSubject)
      • 代理(Proxy)
    • 适用场景:
      • 远程代理:为远程的对象提供代理。
      • 虚代理:根据需要创建恨大的对象。
      • 保护代理:控制对原始对象的访问,用于对象有不同访问权限时。
    • 优点:
      • 远程代理:可以隐藏对象位于远程地址空间的事实。
      • 虚代理:可以进行优化,例如根据要求创建对象。
      • 保护代理:允许在访问一个对象时有一些附加的内务处理。

    image.png

    1. from abc import abstractmethod, ABCMeta
    2. class Subject(metaclass=ABCMeta):
    3. @abstractmethod
    4. def get_content(self):
    5. raise NotImplemented
    6. class RealSubject(Subject):
    7. def __init__(self, filename):
    8. print("读取%s文件内容" % filename)
    9. f = open(filename)
    10. self.content = f.read()
    11. f.close()
    12. def get_content(self):
    13. return self.content
    14. class ProxyA(Subject):
    15. def __init__(self, filename):
    16. self.subj = RealSubject(filename)
    17. def get_content(self):
    18. return self.subj.get_content()
    19. # --- 虚代理
    20. class ProxyB(Subject):
    21. def __init__(self, filename):
    22. self.filename = filename
    23. self.subj = None
    24. def get_content(self):
    25. if not self.subj:
    26. self.subj = RealSubject(self.filename)
    27. return self.subj.get_content()
    28. class ProxyC(Subject):
    29. def __init__(self, filename):
    30. self.subj = RealSubject(filename)
    31. def get_content(self):
    32. return "???"
    33. filename = "abc.txt"
    34. username = input()
    35. if username != "gaogao":
    36. p = ProxyC(filename)
    37. else:
    38. p = ProxyA(filename)
    39. print(p.get_content())