代理模式(Proxy Pattern)

好问题!现在我们来讲解经典的结构型设计模式之一:代理模式(Proxy Pattern)


我将通过:

✅ 一句话定义 + 🎯 为什么需要 + ✅ 优劣分析

🐍 Python完整代码(含注释)+ 🧭 类图 + 应用场景举例

一步步帮你掌握这个非常实用的模式。


🧠 一句话定义

代理模式是通过一个"代理对象",在访问真实对象前控制其访问、增强其功能,而不暴露真实对象的细节。


🎯 为什么需要代理?

场景 原因
真实对象创建成本高 提供延迟加载(虚拟代理)
需要访问控制 限制或鉴权(保护代理)
需要功能增强 日志、缓存、性能统计(增强代理)
客户端不应直接接触复杂实现 屏蔽内部结构(远程代理)

✅ 优点 vs ❌ 缺点

✅ 优点 ❌ 缺点
控制访问,保护对象 增加类数目和复杂度
降低真实对象负担 调试复杂(多一层)
动态增强功能(符合开闭原则) 可能隐藏真正错误

🐍 Python 示例:图像加载代理(懒加载)

模拟"打开图像文件",但只有在真正需要时才加载


🖼️ 1️⃣ 抽象接口(Subject)

python 复制代码
from abc import ABC, abstractmethod

class Image(ABC):
    @abstractmethod
    def display(self):
        pass

📷 2️⃣ 真实对象(RealSubject)

python 复制代码
class RealImage(Image):
    def __init__(self, filename):
        self.filename = filename
        self.load_from_disk()

    def load_from_disk(self):
        print(f"🧾 加载图像文件: {self.filename}")  # 模拟开销大

    def display(self):
        print(f"📷 显示图像: {self.filename}")

🪞 3️⃣ 代理类(Proxy)

python 复制代码
class ProxyImage(Image):
    def __init__(self, filename):
        self.filename = filename
        self.real_image = None  # 尚未加载

    def display(self):
        if self.real_image is None:
            # 懒加载:首次使用才创建真实对象
            self.real_image = RealImage(self.filename)
        self.real_image.display()

🧪 4️⃣ 客户端使用

python 复制代码
# 创建代理图像对象(不立即加载)
img1 = ProxyImage("girl.jpg")
img2 = ProxyImage("logo.png")

# 实际显示时才加载真实图像
img1.display()
img1.display()  # 第二次调用不会重新加载
img2.display()

✅ 输出结果

复制代码
🧾 加载图像文件: girl.jpg
📷 显示图像: girl.jpg
📷 显示图像: girl.jpg
🧾 加载图像文件: logo.png
📷 显示图像: logo.png

🧭 类图(Mermaid)

组合关系 <<interface>> Image +display() RealImage +display() -load_from_disk() ProxyImage -real_image +display()


🧠 应用场景总结

类型 应用示例
虚拟代理 图像/视频懒加载、延迟数据库连接
保护代理 权限校验、安全访问控制
远程代理 远程调用服务(RPC 框架)
智能引用代理 引用计数、对象池、缓存管理
日志代理 增加日志、监控、统计时间等功能

✅ 总结口诀

"对象不想直接用,先找代理挡一挡"

✅ 代理模式让你在不改动原对象的前提下,控制、延迟或增强它的访问方式


是否要我演示一个网络接口的请求代理、数据库缓存代理或 token 鉴权代理版本?我可以帮你按实际项目场景做一个专属 Proxy 模板!是否继续?

相关推荐
季鸢15 小时前
Java设计模式之代理模式详解
java·设计模式·代理模式
洛阳泰山16 小时前
Spring AI 智能体代理模式(Agent Agentic Patterns)
人工智能·spring·代理模式·智能体·spring ai
雾喔20 小时前
LCR 094. 分割回文串 II
代理模式
Logan Lie1 天前
在 Ubuntu 终端中配置网络代理:优化 npm、apt等的下载速度
linux·ubuntu·npm·代理模式
iceslime4 天前
算法分析与设计实验:找零钱问题的贪心算法与动态规划解决方案
代理模式
77tian9 天前
设计模式的原理及深入解析
java·开发语言·单例模式·设计模式·代理模式·享元模式·原型模式
wu~97010 天前
手撕四种常用设计模式(工厂,策略,代理,单例)
java·单例模式·设计模式·代理模式·抽象工厂模式·策略模式
Auc2416 天前
OJ判题系统第4期之判题机模块架构——设计思路、实现步骤、代码实现(工厂模式、代理模式的实践)
java·spring cloud·log4j·mybatis·代理模式·工厂模式
Yang三少喜欢撸铁17 天前
【阿里云免费领取域名以及ssl证书,通过Nginx反向代理web服务】
nginx·阿里云·代理模式·ssl
Blurpath17 天前
什么是静态住宅IP?为什么静态住宅IP能提高注册通过率?
网络·代理模式·ip代理·住宅ip