Python:设计模式之代理模式

简介: Python:设计模式之代理模式

一、代理模式

代理,通常就是一个介于寻求方和提供方之间的中介系统

设计模式中,代理充当实际对象接口的类

二、使用场景

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
"""

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()
    """
    借记卡支付开始
    借记卡即将去银行支付
    账户检查中...
    银行结算完成
    借记卡完成银行支付
    借记卡支付结束
    """

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

代理模式 门面模式
为其他对象提供了代理或占位符,以控制对原始对象的访问 为类的大型子系统提供了一个接口
代理对象具有与其目标对象相同的接口,并保存有目标对象的引用 实现了子系统之间的通信和依赖性的最小化
充当客户端和被封装对象之间的中介 门面对象提供了单一的简单接口
相关文章
|
设计模式 缓存 数据库连接
Python:设计模式之代理模式
Python:设计模式之代理模式
83 0
|
Python
5、Python与设计模式--代理模式
#一、网络服务器配置白名单 代理模式是一种使用频率非常高的模式,在多个著名的开源软件和当前多个著名的互联网产品后台程序中都有所应用。下面我们用一个抽象化的简单例子,来说明代理模式。 首先,构造一个网络服务器: ``` #该服务器接受如下格式数据,addr代表地址,content代表接收的信息内容 info_struct=dict() info_struct["addr"]=10000
8379 0
|
2月前
|
设计模式 存储 数据库连接
Python编程中的设计模式之美:单例模式的妙用与实现###
本文将深入浅出地探讨Python编程中的一种重要设计模式——单例模式。通过生动的比喻、清晰的逻辑和实用的代码示例,让读者轻松理解单例模式的核心概念、应用场景及如何在Python中高效实现。无论是初学者还是有经验的开发者,都能从中获得启发,提升对设计模式的理解和应用能力。 ###
|
4月前
|
设计模式 存储 数据库连接
Python设计模式:巧用元类创建单例模式!
Python设计模式:巧用元类创建单例模式!
51 0
|
设计模式 监控 数据库
Python:设计模式之单例模式
Python:设计模式之单例模式
86 0
|
设计模式 存储 测试技术
Python 设计模式:单例模式
单例模式可能是最简单的设计模式,单例是非常通用的对象。让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。
|
设计模式 监控 数据库
Python:设计模式之单例模式
Python:设计模式之单例模式
133 0
|
Python
1、Python与设计模式--单例模式
#一、总线 总线是计算机各种功能部件或者设备之间传送数据、控制信号等信息的公共通信解决方案之一。现假设有如下场景:某中央处理器(CPU)通过某种协议总线与一个信号灯相连,信号灯有64种颜色可以设置,中央处理器上运行着三个线程,都可以对这个信号灯进行控制,并且可以独立设置该信号灯的颜色。
25763 1
cxa
|
Python
python设计模式之单例模式(二)
上次我们简单了解了一下什么是单例模式,今天我们继续探究。 上次的内容点这 上次们讨论的是GoF的单例设计模式,该模式是指:一个类有且只有一个对象。通常我们需要的是让实例共享一个相同的装态 比如数据库连接。
cxa
3797 0
cxa
|
Python 设计模式 C#
python设计模式之单例模式(一)
单例设计模式的概念: 单例设计模式即确保类有且只有一个特定类型的对象,并提供全局访问点。一般我们操作数据库的时候为了避免统一资源产生互相冲突,创建单例模式可以维护数据的唯一性。 单例模式的特性: 确保类有且只有一个对象被创建。
cxa
1477 0