简介
接着外观模式,我们终于迎来了最后一个行为类的设计模式了。
而很巧的是代理模式和外观模式看起来有点像,而且和之后的中介者模式也有些联系。
正文
代理模式,顾名思义就是有个代理商的存在。
今天妈妈要你去打酱油,你肯定不会自己跑到酱油厂去打壶酱油回来,而是跑去楼下小卖部去打一瓶满满的酱油回来等妈妈夸奖你一番。
这个楼下小卖部就是我们所说的代理商了。 大概的逻辑如下:
看着这幅图是不是感觉有点眼熟,这不就是外观模式的图再反转一下吗?看起来是这样的,但是具体实现的功能和外观模式确实截然不同。
我们用一个简单的例子来演示一下:
class Commodity:
name = "酱油"
class Shop:
inventory = 0
commodity = Commodity
def stock(self,num):
print("进货了",self.commodity.name,"进货",num)
self.inventory += num
def shipping(self):
if self.inventory:
self.inventory -= 1
print("出货了",self.commodity.name)
print(self.commodity.name,"还剩",self.inventory)
else:
print("没货了")
self.stock(10)
s = Shop()
class Client:
def __init__(self,name):
self.name = name
def buy(self,commodity):
print(self.name,"去小卖部买",commodity)
s.shipping()
c1 = Client("张三")
c1.buy("酱油")
c2 = Client("李四")
c2.buy("酱油")
c3 = Client("王五")
c3.buy("酱油")
上面这个小例子我们主要实现了三个类,商品类,商店类,客户类。其中商店类就是我们的代理。
这时候大家可能会有一个疑问,我们完全可以将商店类的功能写到商品类中,为什么要多写一个商店类增加自己的负担呢?
我们举个例子,我们的酱油会有一个内部进货价,这个进货价只有商店老板可以查看,其它客户不能查看,这时候我们就可以通过代理,拦截除了老板以外的客户。
class Commodity:
name = "酱油"
price = 100
class Shop:
inventory = 0
commodity = Commodity
def stock(self,num):
print("进货了",self.commodity.name,"进货",num)
self.inventory += num
def shipping(self):
if self.inventory:
self.inventory -= 1
print("出货了",self.commodity.name)
print(self.commodity.name,"还剩",self.inventory)
else:
print("没货了")
self.stock(10)
def get_price(self):
print("零售价",1000)
def get_inner_price(self,name):
if name == "老板":
print("进货价",self.commodity.price)
else:
print("不是老板,无权查看")
s = Shop()
class Client:
def __init__(self,name):
self.name = name
def buy(self,commodity):
print(self.name,"去小卖部买",commodity)
s.shipping()
def get_price(self):
s.get_price()
def get_inner_price(self):
s.get_inner_price(self.name)
c1 = Client("张三")
c1.get_price()
c1.get_inner_price()
c4 = Client("老板")
c4.get_price()
c4.get_inner_price()
这个时候,小伙伴们又会问了,这个功能感觉很鸡肋呀,而且我也可以直接写在商品类里面呀。
确实,直接写在商品类中也可以达到一样的目的,但是这时候你商品类的耦合度就很高了,万一你今天不打酱油了,去买泡面了,难不成也需要在泡面类中定义一个判断,判断是不是老板来进货吗?
上面的小例子都是只代理一件商品,但是生活中可能会存在一个代理商代理多件产品,这时候应该怎么办呢?
这个问题我留给各位小伙伴思考一下,下一篇推文中揭晓答案(文章开头有提示)。
总结
下面是百度到的关于代理模式的应用场景:
代理模式的应用场景:
1.远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
2.虚拟代理,是根据需要创建开销大的对象。通过它来存放实例化需要很长时间的真是对象,例如html中,图片需要load很久,所以通过虚拟代理来代替真实的图片
3.安全代理,用来控制真实对象访问时的权限
4.智能指引,是指当调用真实的对象时,代理处理另外一些事
在例子中我们主要演示了1,3功能,对于2,4功能没有演示(而且没弄懂2的意思,希望有大佬可以指点一下)。相信还是很容易理解的。希望对今后的开发有所帮助