代理模式:为其他对象提供一种代理以控制对这个的访问。
原文取自大话设计模式,这里将其转为python代码!
需求:张三通过李四给美女娇娇送鲜花!
下面的代码是不通过代理的方式,张三直接给娇娇送鲜花!
# 追求者类
class Pursuit():
name=None
mm=None
def __init__(self,name,mm):
self.name=name
self.mm=mm
def giveDolls(self):
print("我是"+self.name+",我要给"+self.mm.name+"送洋娃娃")
def giveFlowers(self):
print("我是"+self.name+",我要给"+self.mm.name+"送鲜花")
#被追求类
class Girl():
name=None
def setName(self, name):
self.name=name
def getName(self):
return self.name
if __name__ == '__main__':
girl=Girl()
girl.setName("娇娇")
pursuit=Pursuit('张三',girl)
pursuit.giveDolls()
pursuit.giveFlowers()
下面的代码是只有【代理人】的方式,李四给娇娇送鲜花!
#代理人类
class Proxy():
name=None
mm=None
def __init__(self,name,mm):
self.name=name
self.mm=mm
def giveDolls(self):
print("我是代理人"+self.name+",我要给"+self.mm.name+"送洋娃娃")
def giveFlowers(self):
print("我是代理人"+self.name+",我要给"+self.mm.name+"送鲜花")
#被追求类
class Girl():
name=None
def setName(self, name):
self.name=name
def getName(self):
return self.name
if __name__ == '__main__':
girl=Girl()
girl.setName("娇娇")
proxy=Proxy('李四',girl)
proxy.giveDolls()
proxy.giveFlowers()
含有张三(追求者)、李四(代理者)、娇娇(女神)的代码:
# 代理接口
class GiveGift():
def giveDolls(self):
pass
def giveFlower(self):
pass
# 追求者类-张三
class Pursuit(GiveGift):
mm = None
name='张三'
def __init__(self, mm):
self.mm = mm
def giveDolls(self):
print(self.mm.name + "送你洋娃娃")
def giveFlower(self):
print(self.mm.name + "送你鲜花")
# 代理类-李四
class Proxy(GiveGift):
name='李四'
pursuit=None
def __init__(self,mm):
# 这里创建了追求者类-张三
self.pursuit=Pursuit(mm)
# 这里封装了追求者的追求发那个发
def proxy_giveDolls(self):
self.pursuit.giveDolls()
def proxy_giveFlower(self):
self.pursuit.giveFlower()
class Girl():
def __init__(self,name):
self.name=name
if __name__ == '__main__':
jiaojiao=Girl('jiaojiao')
daili=Proxy(jiaojiao)
daili.proxy_giveDolls()
daili.proxy_giveFlower()
首先,追求者类和代理类都继承了同一个接口。
其次,代理类作为代理,肯定是知道追求者和被追求者,所以其封装了追求者和被追求者娇娇。
这里有点像属性的封装,即通常所说的get/set。
远程代理:在使用场景中,代理的目的就是给一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实,这种代理,叫做远程代理。
虚拟代理:还有一种代理叫做虚拟代理:即现有一个创建时【开销需要很大】的【对象】,那么这时就需要通过【代理】来存放【实例化需要很长时间】的【真实对象】。
例如:访问某网页时,其中有大量文字和图片、加载文字快,但图片慢,这时候就会用【div】在【html】中进行【占用代理】,等图片完全下载完后,进行替换,俗称虚拟代理
安全代理:用来控制真实对象的访问权限,就是我们通常所用的get/set属性封装
智能指引:即调用真实的对象时,代理处理另外一些事。
例如:计算某个【真实对象】的引用次数,该真实对象无引用时,自动释放掉该指引。
或当处理【真实对象】时,首先会通过指引确认该对象不被其他引用,确保其他对象改变。