1.定义
1 | 2 |
---|---|
定义 | 为对象提供一种代理以控制这种对象 |
角色 | 抽象实体(Subject) 实体(RealSubject) 代理(Proxy) |
优点 | **远程代理:**可以隐藏对象位于远程地址空间的事实 虚代理 : 可以进行优化,例如根据需求创建对象 **保护代理:**允许在访问一个对象的时候有一些附加的内务处理 |
缺点 | 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂 |
应用场景 | 按职责来划分,通常有以下使用场景: 1.远程代理。 2.虚拟代理。 3.Copy-on-Write 代理。 4.保护(Protect or Access)代理。 5.Cache代理。 6.防火墙(Firewall)代理。 7.同步化(Synchronization)代理。 8.智能引用(Smart Reference)代理 |
2.示例
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
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
f = open(filename, "r")
self.content = f.read()
f.close()
def get_content(self):
return self.content
def set_content(self, content):
f = open(self.filename, "w")
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):
pass
# 保护代理
class ProtectedProxy(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("无写入权限")
if __name__ == '__main__':
subj1 = RealSubject("new")
print(subj1.get_content())
subj2 = VirtualProxy("new")
print(subj2.get_content())
subj3 = ProtectedProxy("new")
print(subj3.set_content("a"))