結構型模式--代理模式

代理模式之使用场景:

  • 可提高對现有实际对象的安全性:一般不允许客户端直接访问实际对象,这是因为实际对象可能會受到恶意活动的危害,此时使用代理可作為抵御恶意活动的盾牌作用以保护实际对象。
  • 可为使用远程对象提供本地接口:以本地作為远程对象之緩存,一般會将客戶端请求先行交给本地代理对象來處理,之后如有需要可再转交该请求由远程机器上來执行。
  • 可为消耗大量内存的对象提供轻量级句柄:因有时候可能不想加载主要对象,除非它们真的有必要,因实际对象很笨重會消耗大量內存,如网站用户的个人简介完整头像,此時最好在列表视图中先行显示個人简介头像的缩略图,如有需求要展示用户简介的详细介绍時,才需要加载实际完整图。

示例之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.代理可用网络连接和数据库连接的远程服务器进行交互,并可搭配监视系统來使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值