前言
代理模式的本质就是隐藏真实角色信息,实现间接接触。比如我们平常在租房时会找中介,中介就相当于一个代理,房东和租户直接联系的都是中介。
代理模式有3个必要的元素:
- 真实的对象(执行业务逻辑,被代理的对象)
- 代理类(用户请求的一个接口,对真实目标的保护)
- 用户(获取任务的用户请求)
代理模式的应用场景:
1.远程代理:也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
2.虚拟代理:是根据需要创建开销大的对象。通过它来存放实例化需要很长时间的真实对象,例如html中,图片需要load很久,所以通过虚拟代理来代替真实的图片
3.安全代理:用来控制真实对象访问时的权限
代码 :
'''代理模式'''
#本质:隐藏真实角色信息,实现间接接触
from abc import abstractmethod
class FemaleA():
def __init__(self,name):
self.name = name
class Male():
@abstractmethod
def send_flower(self):
pass
@abstractmethod
def send_choclate(self):
pass
@abstractmethod
def send_book(self):
pass
class Male_hidden(Male):
def __init__(self,name,love_female):
self.name = name
self.love_female = FemaleA(love_female)
def send_flower(self):
print("%s送花给%s"%(self.name,self.love_female.name))
def send_choclate(self):
print("%s送巧克力给%s"%(self.name,self.love_female.name))
def send_book(self):
print("%s送书给%s"%(self.name,self.love_female.name))
class Proxy(Male):
'''代理类,同时拥有真实对象和用户的信息'''
def __init__(self,name,proxyed_name,love_female):
self.name = name
self.proxyed = Male_hidden(proxyed_name,love_female)
def send_flower(self):
self.proxyed.send_flower()
def send_choclate(self):
self.proxyed.send_choclate()
def send_book(self):
self.proxyed.send_book()
if __name__ == "__main__":
p = Proxy('张三','李四','美女')
p.send_flower()
p.send_choclate()
p.send_book()
执行结果:
最终执行的还是真实角色的方法,只是调用者是看不到的,实现了真实角色信息的隐藏。
参考连接: