代理模式:远程代理、虚代理、保护代理
作用:
远程代理:隐藏对象位于远程地址空间的事实,
例如写入数据,而数据库不在本地,需要远程访问。隐藏数据库不在本地的事实,使用代理进行远程存储。
虚代理:为了节省资源开销,在功能没有被真正调用时,就不运行。
例如浏览器中的无图模式,不显示图片,等你真正需要查看某张时,点击才会真正加载图像,不点击时,只会告诉你,此处是一张图像,并不显示
保护代理:为了区分用户权限而设置的代理。
例如普通用户只有访问权限,而开发人员有写入权限。
正常读写文件使用(未包含代理)
from abc import ABCMeta, abstractmethod
class Subject(metaclass=ABCMeta):
@abstractmethod
def get_content(self):
pass
@abstractmethod
def set_content(self, content):
pass
class RealSubject(Subject):
def __init__(self, filename):
self.filename = filename
print('读取文件内容!')
with open(self.filename, 'r', encoding='utf-8') as f:
self.content = f.read()
def get_content(self):
return self.content
def set_content(self, content):
with open(self.filename, 'w', encoding='utf-8') as f:
f.write(content)
subj = RealSubject('test.txt')
"""
读取文件内容!
"""
虚代理
from abc import ABCMeta, abstractmethod
class Subject(metaclass=ABCMeta):
@abstractmethod
def get_content(self):
pass
@abstractmethod
def set_content(self, content):
pass
# 原功能
class RealSubject(Subject):
def __init__(self, filename):
self.filename = filename
print('读取文件内容!')
with open(self.filename, 'r', encoding='utf-8') as f:
self.content = f.read()
def get_content(self):
return self.content
def set_content(self, content):
with open(self.filename, 'w', encoding='utf-8') as f:
f.write(content)
# 原功能的 虚代理
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)
subj = VirtualProxy('test.txt')
print(subj.get_content())
"""
读取文件内容!
"""
保护代理
from abc import ABCMeta, abstractmethod
class Subject(metaclass=ABCMeta):
@abstractmethod
def get_content(self):
pass
@abstractmethod
def set_content(self, content):
pass
# 原功能
class RealSubject(Subject):
def __init__(self, filename):
self.filename = filename
print('读取文件内容!')
with open(self.filename, 'r', encoding='utf-8') as f:
self.content = f.read()
def get_content(self):
return self.content
def set_content(self, content):
with open(self.filename, 'w', encoding='utf-8') as f:
f.write(content)
# 原功能的 保护代理
class ProtectedSubject(Subject):
def __init__(self, filename):
self.subj = RealSubject(filename)
def get_content(self):
return self.subj.get_content()
def set_content(self, content):
raise PermissionError('无写入权限!')
subj = ProtectedSubject('test.txt')
print(subj.get_content())
subj.set_content('abc')
"""
读取文件内容!
test file!
Traceback (most recent call last):
File "/home/thanlon/projects/PycharmProjects/untitled/代理模式.py", line 42, in <module>
subj.set_content('abc')
File "/home/thanlon/projects/PycharmProjects/untitled/代理模式.py", line 37, in set_content
raise PermissionError('无写入权限!')
PermissionError: 无写入权限!
"""