代理模式

代理模式通常在以下的情形下使用:

  • 在访问某个对象之前执行一个或多个重要的额外操作
  • 访问敏感信息或关键功能前需要具备足够的权限
  • 将计算成本较高的对象的创建过程延迟到用户首次真正使用时才进行(惰性求值)

常见类型有:

  • 远程代理:实际存在于不同地址空间(如网络服务器)的对象在本地的代理者(对使用者透明)
  • 虚拟代理:用于惰性求值,将一个大计算量对象的创建延迟到真正需要的时候进行
  • 保护/防护代理:控制对敏感对象的访问
  • 智能(引用)代理:在对象被访问时执行额外的动作,如引用计数或线程安全检查等

实现示例

我们来通过一个案例来看看代理模式具体做了什么。

首先我们定义一个用户信息管理的类KeyRecords,其中拥有大量敏感的不宜公开的信息。

1
2
3
4
5
6
7
8
9
class KeyRecords(Record):
def __init__(self):
self.users=['admin']

def read(self):
return ' '.join(self.users)

def add(self,user):
self.users.append(user)

但是简单的一个类是无法保护其中的信息的,我们需要为其设置一个代理,并添加密码验证的过程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class ProxyRecords(Record):
def __init__(self):
self.key_records=KeyRecords()
self.secrect='test' # 硬编码密码,不推荐,仅示例

def read(self,pwd):
if self.secrect==pwd:
return self.key_records.read()
else:
print("密码错误,不能读取用户信息")

def add(self,pwd,user):
if self.secrect == pwd:
self.key_records.add(user)
else:
print("密码错误,不能添加用户")

这样,通过代理模式,我们给KeyRecord添加密码以及验证密码的步骤,就可以通过密码验证的方式保护用户信息了。