结构型模式代理模式

网友投稿 608 2022-05-25

结构型模式之代理模式

代理模式

为另一个对象提供一个代理或占位者,来控制对该对象的访问。

意图

确保类有且只有一个对象被创建

为对象提供一个访问点,以使程序可以全局访问对象

控制共享资源的并行访问

优点

代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;

代理对象可以扩展目标对象的功能;

代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性

实现

1.抽象主题(Subject)类

通过接口或抽象类声明真实主题和代理对象实现的业务方法。

from abc import ABCMeta, abstractmethod class Payment(metaclass=ABCMeta): @abstractmethod def do_play(self): pass

2.真实主题(Real Subject)类

实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。

class Bank(Payment): def __init__(self): self.card = None self.account = None def __getAccount(self): # 简化, 卡号就是账户号 self.account = self.card return self.account def __hasFunds(self): # 简化,账户号就是金钱数 funds = int(self.__getAccount()) if funds > 1000: print("Bank:: Checking if Account", self.__getAccount(), "has enough funds") return True else: print("Bank:: Checking if Account", self.__getAccount(), "has not enough funds") return False def setCard(self, card): self.card = card def do_play(self): if self.__hasFunds(): print("Bank:: Paying the merchant") return True else: print("Bank:: Sorry, not enough funds!") return False

3.代理(Proxy)类

提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。

class DebitCard(Payment): def __init__(self): self.bank = Bank() def do_play(self): card = input("Proxy: Punch in card Number") self.bank.setCard(card) return self.bank.do_play()

3.客户端类

class LiDogEag: def __init__(self): print("You:: lets buy the Denim shirt!") self.debitCard = DebitCard() self.isPurchased = None def make_payment(self): self.isPurchased = self.debitCard.do_play() def __del__(self): if self.isPurchased: print('You:: Wow!,Denim shirt is Mine!') else: print("You:: I should earn more. 555...") You = LiDogEag() You.make_payment()

李狗蛋(客户端)去商场买牛仔衫,现金不够付款(抽象主题类),但是银行(真实主题类)取钱又太远,于是他使用信用卡(代理类)代付,如果账户前足够则付款成功得到牛仔衫,不够则无法购买。

缺点

代理模式会造成系统设计中类的数量增加

在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;

增加了系统的复杂度;

应用

远程代理,这种方式通常是为了隐藏目标对象存在于不同地址空间的事实,方便客户端访问。例如,用户申请某些网盘空间时,会在用户的文件系统中建立一个虚拟的硬盘,用户访问虚拟硬盘时实际访问的是网盘空间。

虚拟代理,这种方式通常用于要创建的目标对象开销很大时。例如,下载一幅很大的图像需要很长时间,因某种计算比较复杂而短时间无法完成,这时可以先用小比例的虚拟代理替换真实的对象,消除用户对服务器慢的感觉。

安全代理,这种方式通常用于控制不同种类客户对真实对象的访问权限。

智能指引,主要用于调用目标对象时,代理附加一些额外的处理功能。例如,增加计算真实对象的引用次数的功能,这样当该对象没有被引用时,就可以自动释放它。

延迟加载,指为了提高系统的性能,延迟对目标的加载。例如,Hibernate 中就存在属性的延迟加载和关联表的延时加载。

虚拟化

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【Atlas 200 DK】 参照V20.1文档,完成cartoonGAN_picture,验证pyACL安装成功
下一篇:理工男生资源达人的梦想,树莓派低成本创造私人专属互联网的构想及实现
相关文章