python开发中常用的设计模式(代理模式)

代理模式:为其他对象提供一种代理以控制对这个的访问。

原文取自大话设计模式,这里将其转为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属性封装

 

智能指引:即调用真实的对象时,代理处理另外一些事。

例如:计算某个【真实对象】的引用次数,该真实对象无引用时,自动释放掉该指引。

或当处理【真实对象】时,首先会通过指引确认该对象不被其他引用,确保其他对象改变。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值