【Python笔记-设计模式】代理模式

一、说明

代理模式是一种结构型设计模式,提供对象的替代品或其占位符。代理控制着对于原对象的访问,并允许在将请求提交给对象前后进行一些处理。

(一) 解决问题

控制对对象的访问,或在访问对象前增加额外的功能或控制访问

(二) 使用场景

  1. **远程代理:**将对象的访问请求发送给远程服务器,以实现远程对象的访问。这在分布式系统中很常见,可以隐藏远程调用的复杂性。
  2. **虚拟代理:**延迟加载对象,即在需要时才真正创建对象。这可以提高系统的性能和资源利用率。
  3. **保护代理:**控制对对象的访问,只有满足特定条件的请求才能访问对象。这可以用于实现权限控制等安全功能。
  4. **缓存代理:**为昂贵的操作结果提供缓存,以提高系统的性能。当请求相同的操作时,直接返回缓存的结果,避免重复计算。
  5. **智能引用代理:**在对象被引用时进行一些额外的操作,例如计算对象的引用次数,当引用次数为0时自动释放对象。

二、结构

  1. **服务接口(ServiceInterface)**声明了服务接口。代理必须遵循该接口才能伪装成服务对象。
  2. **服务(Service)**类提供了一些实用的业务逻辑。
  3. **代理(Proxy)**类包含一个指向服务对象的引用成员变量。代理完成其任务(例如延迟初始化、记录日志、访问控制和缓存等)后会将请求传递给服务对象。通常情况下,代理会对其服务对象的整个生命周期进行管理。
  4. **客户端(Client)**能通过同一接口与服务或代理进行交互,所以你可在一切需要服务对象的代码中使用代理。

三、伪代码

python 复制代码
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
代理模式

例:买演唱会门票时,找黄牛(代理人)代买门票
"""

from abc import ABC, abstractmethod


class TicketSeller(ABC):
    """抽象主题"""

    @abstractmethod
    def buy_ticket(self) -> None:
        pass


class TrainStationSeller(TicketSeller):
    """真实主题"""

    def buy_ticket(self) -> None:
        print("官方票务平台出票")


class TicketProxy(TicketSeller):
    """代理类"""

    def __init__(self, train_seller: TrainStationSeller) -> None:
        self._train_station_seller = train_seller

    def buy_ticket(self) -> None:
        print("黄牛帮助购买演唱会门票")
        self._train_station_seller.buy_ticket()


if __name__ == "__main__":
    """
        黄牛帮助购买演唱会门票
        官方票务平台出票
    """
    train_station_seller = TrainStationSeller()
    ticket_proxy = TicketProxy(train_station_seller)

    ticket_proxy.buy_ticket()

四、优缺点

优点

  • **远程调用的优化:**可以将远程调用的开销和实现细节隐藏起来,客户端可以像调用本地对象一样调用远程对象,提高系统的性能和效率。
  • **保护目标对象:**可以通过代理类来控制对目标对象的访问,实现权限控制、安全检查等功能,保护目标对象不被非法访问。
  • **延迟加载:**可以延迟加载目标对象,只有在真正需要时才创建目标对象,节省了系统资源。

缺点

  • **增加系统复杂性:**因为会会引入代理类,可能会导致代码难以理解和维护。
  • **性能损耗:**在某些情况下,代理模式可能会引入额外的性能损耗,例如远程代理需要进行网络通信,可能会影响系统的响应速度。

【Python笔记】设计模式-CSDN博客

相关推荐
qq_三哥啊1 天前
【mitmproxy】提取 OpenCode 的 API 接口
网络·代理模式
qq_三哥啊1 天前
【mitmproxy】通过 mitmproxy 的本地捕获代理模式获取 OpenCode 发起的 AI API 请求的详细信息
网络·系统安全·代理模式
fengfuyao9854 天前
MATLAB实现自适应动态规划(ADP)方法
matlab·动态规划·代理模式
geovindu7 天前
go: Proxy Pattern
开发语言·后端·设计模式·golang·代理模式
我爱cope11 天前
【从0开始学设计模式-12| 代理模式】
设计模式·代理模式
两年半的个人练习生^_^12 天前
每日一学:设计模式之代理模式
java·设计模式·代理模式
天若有情67313 天前
用动态规划思路,一步一步实现响应式数据(从本质到落地)
算法·动态规划·代理模式
希望永不加班13 天前
Spring AOP 代理模式:CGLIB 与 JDK 动态代理区别
java·开发语言·后端·spring·代理模式
阿Y加油吧15 天前
动态规划经典题解:最长递增子序列 & 乘积最大子数组
算法·动态规划·代理模式
计算机安禾16 天前
【数据结构与算法】第48篇:算法思想(三):贪心算法
c语言·开发语言·数据结构·算法·贪心算法·代理模式·图论