代理模式
内容:为其他对象提供一种代理以控制对这个对象的访问。
应用场景:
- 远程代理:为远程的对象提供代理
- 虚代理:根据需要创建很大的对象
- 保护代理:控制对原始对象的访问,用于对象有不同访问权限时
代理模式(Proxy Pattern)是一种结构型设计模式,它允许通过代理对象控制对另一个对象的访问。
代理模式涉及以下几个角色:
- 抽象主题(Subject):定义了真实主题和代理主题的共同接口,这样在使用代理的地方就可以使用真实主题或代理主题,实现了客户端与真实主题之间的松耦合。
- 真实主题(Real Subject):定义了代理所代表的真实对象,是实际执行业务逻辑的对象。
- 代理(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()