代理模式
定义
代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。
场景
在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
例如,西门大官人想要和潘金莲happy,但是不能太光明正大,所以就让王婆做中间代理。
实现
以西门大官人、潘金莲、王婆的故事做例子,讲解代理模式的实现。
# 抽象类,女人类,定义女人的行为
class Female(object):
# 和男人抛媚眼
def make_eyes_with_man(self):
pass
# 和男人happy
def happy_with_man(self):
pass
# 真实类,潘金莲,潘金莲属于女人,所以继承女人类
class PanJinLian(Female):
def __init__(self):
self.name = "潘金莲"
def make_eyes_with_man(self):
print(f"{self.name}和男人抛媚眼...")
def happy_with_man(self):
print(f"{self.name}和男人happy...")
# 代理类,王婆,王婆也是女人,所以能做代理
class WangPo(Female):
def __init__(self):
self.female = PanJinLian()
def make_eyes_with_man(self):
# 王婆老了,谁看她抛媚眼,看的是她身后的潘金莲呀
self.female.make_eyes_with_man()
def happy_with_man(self):
# 王婆老了,干不了了,但潘金莲可以呀
self.female.happy_with_man()
# 客户,大官人西门庆
class XiMenDaGuanRen(object):
def do_love(self):
# 西门大官人想要潘金莲,但是不能太光明正大,所以要通过王婆这个代理
wang_po = WangPo()
# 此时,潘金莲和西门大官人两人眉目传情,中间隔着王婆
wang_po.make_eyes_with_man()
# 没过多久,他俩就在一起happy了
wang_po.happy_with_man()
if __name__ == "__main__":
XiMenDaGuanRen().do_love()
总结一下,代理模式主要使用了Python的多态和继承,干活的是被代理类(真实类),代理类主要是接活,你让我干活,好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能干呢?都是出自同一个基类,能不知道嘛。
模式的结构
抽象类:声明真实类和代理类的共同基类和接口。
真实类:执行业务逻辑,被代理的对象。
代理类:用户请求的一个接口,实现对真实类的保护。代理类内部含有对真实类的引用,从而可以操作真实类,同时代理类提供与真实类相同的基类(接口)以便在任何时刻都能代替真实类。同时,代理类可以在调用真实类操作时附加额外的操作,相当于对真实类进行封装。
常见代理
1.远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
2.虚拟代理,将一个对象的初始化延迟到真正需要使用时进行。
3.安全代理,或叫保护/防护代理,控制对敏感对象的访问。用来控制真实对象访问时的权限。
4.智能(引用)代理,在对象被访问时执行额外的动作。此类代理的例子包括引用计数和线程安全检查。