代理模式
(Proxy):为某个对象提供一种代理以控制对这个对象的访问。
注意 :代理模式和策略模式的类图很相近,实现方法也是一样的,但是应用场景很不一样,体现了不同的思想。
策略模式中 同一外部对象 访问 上下文对象 的操作一样,但是 里面的策略对象不同 。
代理模式中 不同的外部对象 访问 代理对象 的操作一样,但是 里面的真实对象是一样的 。
代理模式在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途 。
应用场景 :
1、远程代理。为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
2、虚拟代理。当要创建耗时很长的对象时,可以使用虚拟代理。虚拟代理完成的工作为新建真实对象,并在新建的过程中给出提示。比如在网页加载图片的过程中,虚拟代理可以用一个图片框暂时替代真实的图片。
3、安全代理。用于控制真实对象访问是的权限。
注意 :代理模式和策略模式的类图很相近,实现方法也是一样的,但是应用场景很不一样,体现了不同的思想。
策略模式中 同一外部对象 访问 上下文对象 的操作一样,但是 里面的策略对象不同 。
代理模式中 不同的外部对象 访问 代理对象 的操作一样,但是 里面的真实对象是一样的 。
代理模式在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途 。
应用场景 :
1、远程代理。为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
2、虚拟代理。当要创建耗时很长的对象时,可以使用虚拟代理。虚拟代理完成的工作为新建真实对象,并在新建的过程中给出提示。比如在网页加载图片的过程中,虚拟代理可以用一个图片框暂时替代真实的图片。
3、安全代理。用于控制真实对象访问是的权限。
4、智能指引。当调用真实的对象时,代理处理另外一些事情,比如计算真实对象的引用次数、是否锁定等等。
- #encoding=utf-8
- #
- #by panda
- #代理模式
- def printInfo(info):
- print unicode(info, 'utf-8').encode('gbk')
- class SchoolGirl():
- Name = ''
- def __init__(self, name):
- self.Name = name
- class GiveGift():
- """接口类:定义通用操作"""
- def GiveDolls(self):
- return
- def GiveFlowers(self):
- return
- def GiveChocolate(self):
- return
- class Pursuit(GiveGift):
- mm = None
- def __init__(self, mm):
- self.mm = mm;
- return;
- def GiveDolls(self):
- printInfo("代理模式:")
- printInfo("送 %s 洋娃娃" % self.mm.Name)
- return
- def GiveFlowers(self):
- printInfo("代理模式:")
- printInfo("送 %s 鲜花" % self.mm.Name)
- return
- def GiveChocolate(self):
- printInfo("代理模式:")
- printInfo("送 %s 巧克力" % self.mm.Name)
- return
- class Proxy(GiveGift):
- gg = None
- def __init__(self, mm):
- self.gg = Pursuit(mm);
- return;
- def GiveDolls(self):
- self.gg.GiveDolls()
- return
- def GiveFlowers(self):
- self.gg.GiveFlowers()
- return
- def GiveChocolate(self):
- self.gg.GiveChocolate()
- return
- def clientUI():
- mm = SchoolGirl(r"韩梅梅")
- proxy = Proxy(mm)
- proxy.GiveDolls()
- proxy.GiveFlowers()
- proxy.GiveChocolate()
- return
- if __name__ == '__main__':
- clientUI();
类图: