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

news/2024/7/6 6:30:38 标签: 代理模式

一、说明

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

(一) 解决问题

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

(二) 使用场景

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

二、结构

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

三、伪代码

#!/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博客


http://www.niftyadmin.cn/n/5393209.html

相关文章

OPENSSL-PKCS7入门知识介绍

1 PKCS7数据结构说明 p7包括6种数据内容:数据(data),签名数据(sign),数字信封数据(enveloped),签名数字信封数据(signed_and_enveloped),摘要数据&#xff08…

6.openEuler系统服务的配置和管理(二)

openEuler OECA认证辅导,标红的文字为学习重点和考点。 如果需要做实验,建议安装麒麟信安、银河麒麟、统信等具有图形化的操作系统,其安装与openeuler基本一致。 3.任务管理 任务的概念和相关术语: 当你在终端或控制台工作时,可能不希望由于运行一个作业而占住了屏幕,因…

Spring Session:Redis序列化配置|Session事件监听

Spring Session是可配置的。 Redis Configuration JSON序列化配置 Spring Session默认使用Java对象序列化机制对Session属性值进行序列化。 预定义类SysUser 先来定义一个SysUser类,在下面的演示案例中会用到。 package com.example.demo.model.entity;import j…

docker创建mongodb数据库容器

介绍 本文将通过docker创建一个mongodb数据库容器 1. 拉取mongo镜像 docker pull mongo:3.63.6版本是一个稳定的版本,可以选择安装此版本。 2. 创建并启动主数据库 容器数据卷配置 /docker/mongodb/master/data # 数据库数据目录(宿主机&am…

Python炒股自动化(2):获取股票实时数据和历史数据

如果你是一位大佬,看我前面的分享即可,相信你有自己的思路,或者已经有了成熟的策略,你需要的只是API接口来实现你的想法,前面的分享是你需要的,这些是给刚开始接触程序交易的朋友分享的。 前面发了股票程序…

vue间的组件通讯

文章目录 父子组件通讯(通过props和$emit)兄弟组件通讯(使用事件总线):跨级组件通讯(使用provide/inject):使用Vuex状态管理:使用$refs引用组件: 父子组件通讯…

docker 安装nacos 一脚shell脚本

要创建一个用于安装Nacos的Docker的Shell脚本,你可以按照以下步骤进行。这个脚本会执行以下操作: 拉取Nacos的Docker镜像。创建一个Docker容器并映射必要的端口。设置Nacos的环境变量。如果需要,可以持久化存储数据到本地目录。 以下是一个…

28.云原生之服务网格ServiceMesh和istio

云原生专栏大纲 文章目录 Service Mesh介绍为什么要使用ServiceMesh?Istio介绍istio架构EnvoyIstiod Istio 核心流量管理安全可观测性 Istio 原理istio资源和k8s资源扭转关系istio-ingressgatewayIstio-GatewayVirtualServiceDestinationRule Service Mesh介绍 Se…