代理模式

简介 

接着外观模式,我们终于迎来了最后一个行为类的设计模式了。

而很巧的是代理模式和外观模式看起来有点像,而且和之后的中介者模式也有些联系。


正文

代理模式,顾名思义就是有个代理商的存在。

今天妈妈要你去打酱油,你肯定不会自己跑到酱油厂去打壶酱油回来,而是跑去楼下小卖部去打一瓶满满的酱油回来等妈妈夸奖你一番。

这个楼下小卖部就是我们所说的代理商了。 大概的逻辑如下:

看着这幅图是不是感觉有点眼熟,这不就是外观模式的图再反转一下吗?看起来是这样的,但是具体实现的功能和外观模式确实截然不同。

我们用一个简单的例子来演示一下:

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的意思,希望有大佬可以指点一下)。相信还是很容易理解的。希望对今后的开发有所帮助 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值