Python:设计模式之代理模式

举报
彭世瑜 发表于 2021/08/14 00:12:08 2021/08/14
【摘要】 一、代理模式 代理,通常就是一个介于寻求方和提供方之间的中介系统 设计模式中,代理充当实际对象接口的类 二、使用场景 1、以简单的方式表示一个复杂系统 2、提高现有实际对象的安全性 3、为不同服务器上的远程对象提供本地接口 4、为消耗大量内存的对象提供一个轻量级的句柄 三、代理模式的优点 1、代理模式可以通过缓存笨重的对象或频繁访问的对象来提高应用程序的性能 ...

一、代理模式

代理,通常就是一个介于寻求方和提供方之间的中介系统
设计模式中,代理充当实际对象接口的类

二、使用场景

1、以简单的方式表示一个复杂系统
2、提高现有实际对象的安全性
3、为不同服务器上的远程对象提供本地接口
4、为消耗大量内存的对象提供一个轻量级的句柄

三、代理模式的优点

1、代理模式可以通过缓存笨重的对象或频繁访问的对象来提高应用程序的性能
2、代理还提供对于真实主题的访问授权
3、远程代理还便于与可用作网络连接和数据库连接的远程服务器进行交互,并可用于监视系统

四、3个主要参与者

1、代理:控制对真实主题类的访问的类
2、主题/真实主题:主题是定义真实主题和代理相类似的接口,真实主题是主题的实现,提供真正功能,由客户端使用
3、客户端:访问要完成工作的代理类

五、代理类的类型

1、虚拟代理:如果一个对象实例化后会占用大量内存的话,可以先利用占位符来表示
2、远程代理:给卫浴远程服务器或不同地址空间上的实际对象提供本地表示
3、保护代理:能够控制真实对象的铭感对象的访问
4、智能代理:在访问时插入其他操作

六、代码示例

1、经纪人作为演员的代理人,安排演员的行程

# -*- coding: utf-8 -*-

class Actor(object): def __init__(self): self.is_empty = True def show_film(self): self.is_empty = False print(type(self).__name__, "show_film") def listen_music(self): self.is_empty = True print(type(self).__name__, "listen_music")


class Agent(object): def __init__(self): self.actor = Actor() def work(self): if self.actor.is_empty: self.actor.show_film() else: self.actor.listen_music()


if __name__ == '__main__': agent = Agent() agent.work() agent.work()
"""
Actor show_film
Actor listen_music
"""

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

2、通过借记卡代理银行完成支付工作

# -*- coding: utf-8 -*-

from abc import ABC, abstractmethod


# 支付接口
class Payment(ABC): @abstractmethod def do_pay(self): pass


# 银行类:真实主题
class Bank(Payment): def check_account(self): print("账户检查中...") return True def do_pay(self): self.check_account() print("银行结算完成")


# 银行类的代理
class DebitCard(Payment): def __init__(self): self.bank = Bank() def do_pay(self): print("借记卡即将去银行支付") self.bank.do_pay() print("借记卡完成银行支付")


# 客户端
class You(object): def __init__(self): self.debit_card = DebitCard() def make_payment(self): print("借记卡支付开始") self.debit_card.do_pay() print("借记卡支付结束")


if __name__ == '__main__': you = You() you.make_payment() """ 借记卡支付开始 借记卡即将去银行支付 账户检查中... 银行结算完成 借记卡完成银行支付 借记卡支付结束 """


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

七、门面模式和代理模式比较

代理模式 门面模式
为其他对象提供了代理或占位符,以控制对原始对象的访问 为类的大型子系统提供了一个接口
代理对象具有与其目标对象相同的接口,并保存有目标对象的引用 实现了子系统之间的通信和依赖性的最小化
充当客户端和被封装对象之间的中介 门面对象提供了单一的简单接口

文章来源: pengshiyu.blog.csdn.net,作者:彭世瑜,版权归原作者所有,如需转载,请联系作者。

原文链接:pengshiyu.blog.csdn.net/article/details/92096289

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。