代理模式之使用场景:
- 可提高對现有实际对象的安全性:一般不允许客户端直接访问实际对象,这是因为实际对象可能會受到恶意活动的危害,此时使用代理可作為抵御恶意活动的盾牌作用以保护实际对象。
- 可为使用远程对象提供本地接口:以本地作為远程对象之緩存,一般會将客戶端请求先行交给本地代理对象來處理,之后如有需要可再转交该请求由远程机器上來执行。
- 可为消耗大量内存的对象提供轻量级句柄:因有时候可能不想加载主要对象,除非它们真的有必要,因实际对象很笨重會消耗大量內存,如网站用户的个人简介完整头像,此時最好在列表视图中先行显示個人简介头像的缩略图,如有需求要展示用户简介的详细介绍時,才需要加载实际完整图。
示例之UML类图
- 抽象主题Subject類:定义供外界調用之公共接口。
- 真实主题RealSubject類:實作抽象主題Subject類所定義公共接口之具体实现,此類要提供真正需求的功能操作。
- 代理Proxy類:维护對真实主题RealSubject對象之引用(*即要负责對真实主题RealSubject對象之创建/删除),並允许此類透过这个引用来访问实际对象,此外為能配合处理客户端的请求還須提供与抽象主题Subject類相同的接口供客戶端來調用。
- 客户端Client:引导工作请求以访问代理Proxy类,透過代理Proxy类在内部控制对真实主题RealSubject對象作访问。
常見代理之應用类型:
1.虚拟代理:
当客户端發出请求访问对象並在有需要時才会真正创建实际对象,如:网站加载大型图片之場合,由於这類图片通常需要很长时间才能加载完成,故在开发設計時通常會在网页上先行创建一个占位符图标作替代,只有当客户实际点击图标时才会真正進行加载图像,此作法可节省內存开销之管理。
2.远程代理:
给远程服务器提供一个本地表示作為中介之緩存,如:web服务器。
3.保护代理:
有助于保护网站的核心功能,可進一步检查使用者是否具有转发请求所需的访问权限。
4.智能代理:
可在访问对象时插入其它功能之必要操作。
示例
# -*- coding: UTF-8 -*-
from abc import ABCMeta, abstractmethod
# 抽象主题Subject類
class Payment(metaclass=ABCMeta):
@abstractmethod
def do_pay(self):
pass
# 真实主题RealSubject類
class Bank(Payment):
def __init__(self):
self.card = None
def __getCard(self):
return self.card
def __hasFunds(self):
print("银行:核对卡號",self.__getCard(),"可用")
return True
def setCard(self,card):
self.card = card
def do_pay(self):
if self.__hasFunds():
print("银行::此卡可付款…")
return True
else:
print("银行::此卡不能付款…")
return False
# 代理Proxy類
class DebitCard(Payment):
def __init__(self):
self.bank = Bank() #對真實主題RealSubject類之引用
def do_pay(self):
card = input("代理::输入卡号")
self.bank.setCard(card)
return self.bank.do_pay()
# 客户端
class client:
def __init__(self):
print("Lets buy the Denim shirt")
self.debitCard = DebitCard()
self.isPurchased = None
def make_payment(self):
self.isPurchased = self.debitCard.do_pay()
def __del__(self):
if self.isPurchased:
print("完成付款:-")
else:
print("無法完成付款:(")
if __name__==’__main__’:
client = client()
client.make_payment()
輸出:
Lets buy the Denim shirt
代理::输入卡号1234567890
银行:核对卡號 1234567890 可用
银行::此卡可付款…
完成付款:-
代理模式的优点
1. 代理可缓存笨重或频繁访问的对象来提高应用程序的性能。
2. 代理可提供对于真实主题的访问授权,只有提供合适的权限的情况下,这个模式才会接受委派。
3.代理可用网络连接和数据库连接的远程服务器进行交互,并可搭配监视系统來使用。