代理模式
意义:
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
组成:
- 抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
- 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
- 真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
适用性:
- 远程代理(Remote Proxy )为一个对象在不同的地址空间提供局部代表。 NEXTSTEP[Add94] 使用NXProxy 类实现了这一目的。Coplien[Cop92] 称这种代理为“大使” (Ambassador )。
- 虚代理(Virtual Proxy )根据需要创建开销很大的对象。在动机一节描述的ImageProxy 就是这样一种代理的例子。
- 保护代理(Protection Proxy )控制对原始对象的访问。保护代理用于对象应该有不同 的访问权限的时候。例如,在Choices 操作系统[ CIRM93]中KemelProxies为操作系统对象提供 了访问保护。
- 智能指引(Smart Reference )取代了简单的指针,它在访问对象时执行一些附加操作。 它的典型用途包括:对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放它(也称为SmartPointers[Ede92 ] )。
举例:
class Jurisdiction(object):
#权限类
def level1(self):
print('权限等级1')
def level2(self):
print('权限等级2')
def level3(self):
print('权限等级3')
def level4(self):
print('权限等级4')
class Proxy(object):
def __init__(self, name):
self.user = name
self._jurisdiction = Jurisdiction()
def leve(self):
if self.user == 'a':
return self._jurisdiction.level1()
elif self.user == 'b':
return self._jurisdiction.level2()
elif self.user == 'c':
return self._jurisdiction.level3()
elif self.user == 'd':
return self._jurisdiction.level4()
else:
print('无此权限')
if __name__ == '__main__':
test = Proxy('a')
test.leve()
test.user = 'b'
test.leve()
test.user = 'c'
test.leve()
test.user = 'd'
test.leve()
test.user = 'e'
test.leve()
输出结果:
权限等级1
权限等级2
权限等级3
权限等级4
无此权限