结构型——代理模式

news/2025/3/29 18:50:40/

结构型——代理模式

代理模式指的是通过创建一个代理来控制对原始对象的访问。代理在客户端与实际对象之间充当“中介”

特点

  • 访问控制:代理对象可以控制对实际对象的访问,从而实现对访问权限的控制。
  • 延迟加载:代理对象可以在实际对象被调用时才创建,从而实现延迟加载。
  • 解耦: 客户端金依赖代理接口,可以与实际对象分离,从而实现解耦。
  • 类型多样:虚拟代理(既延迟加载)、缓存代理(缓存对象)、远程代理(远程对象)、保护代理(权限控制)等。

模式结构

角色描述
抽象主题 (Subject)声明真实主题和代理主题的共同接口。客户端依赖此接口
真实主题 (RealSubject)实现抽象主题定义的接口,并提供其功能实现。实际执行业务逻辑的对象
代理主题 (Proxy)实现抽象主题定义的接口,并持有真实主题的引用。代理主题控制对真实主题的访问

代理模式类型

类型应用场景
虚拟代理当需要创建一个大开销的对象时,创建一个代理对象,直到需要时才创建真实的对象。
也叫延迟加载(比如在图片加载时,先加载一张占位图,当图片加载完成后再替换占位图)。
保护代理控制权限(在客户端对真实对象进行访问前,利用代理进行权限校验等操作)。
缓存代理缓存调用结果(为优化性能,将重复计算的值缓存起来,下次使用时直接返回缓存值)。
远程代理本地代理远程服务(将本地的请求转发到远程的对象上)。

简单示例

1. 虚拟代理

python">from abc import ABC, abstractmethod# 抽象主题
class Image(ABC):@abstractmethoddef display(self):pass# 真实主题(大开销对象)
class RealImage(Image):def __init__(self, filename):self.filename = filenameself.load_from_disk()def load_from_disk(self):print(f"Loading {self.filename} from disk")def display(self):print(f"Displaying {self.filename}")# 代理主题(控制加载时机)
class ProxyImage(Image):def __init__(self, filename):self.filename = filenameself.real_image = None      # 延迟加载def display(self):if not self.real_image:self.real_image = RealImage(self.filename)self.real_image.display()# 客户端代码
if __name__ == "__main__":# 创建代理,此时不会实际加载图片proxy_image = ProxyImage("test_image.jpg")             # Loading test_image.jpg from disk# 当需要展示时,实际去加载显示proxy_image.display()                                  # Displaying test_image.jpg

2. 保护代理

python">from abc import ABC, abstractmethod# 抽象主题
class DataBase(ABC):@abstractmethoddef query(self, sql):pass# 真实主题(实现对数据库的查询操作)
class RealDataBase(DataBase):def query(self, sql):return f"query result: {sql}"# 代理(对请求对象进行拦截,权限验证)
class ProxyDataBase(DataBase):def __init__(self, user):self.user = userself.real_db = RealDataBase()def query(self, sql):if self._check_access():return self.real_db.query(sql)else:return "access denied"def _check_access(self):return self.user == "admin"# 客户端代码
if __name__ == "__main__":proxy_db = ProxyDataBase("admin")print(proxy_db.query("select * from user"))         # query result: ....proxy_db = ProxyDataBase("guest")print(proxy_db.query("select * from user"))         # access denied

3. 缓存代理

python">from abc import ABC, abstractmethodclass Calculate(ABC):@abstractmethoddef calculate(self, n): passclass RealCalculate(Calculate):def calculate(self, n):return n * nclass ProxyCalculate(Calculate):def __init__(self):self.cache = {}self.real_calculate = RealCalculate()def calculate(self, n):if n not in self.cache:self.cache[n] = self.real_calculate.calculate(n)return self.cache[n]if __name__ == '__main__':proxy_calculate = ProxyCalculate()for i in range(10):print(proxy_calculate.calculate(i))         # 第一次计算,缓存for i in range(10):print(proxy_calculate.calculate(i))         # 第二次计算,直接从缓存中取

4.远程代理

python">import requestsclass BaiduService:def get_data(self, question): passclass BaiduServiceProxy(BaiduService):def __init__(self):self.question = questionself.baidu_api = "www.baidu.com"def get_data(self, question):response = requests.get(self.baidu_api, params={"question": question})return response.text# 客户端代码
if __name__ == "__main__":# 客户端仅与代理交互,无需感知远程服务的存在baidu_service = BaiduServiceProxy()data = baidu_service.get_data("如何使用代理模式")

代理模式 VS 外观模式 VS 装饰器模式 VS 适配器模式

维度代理模式外观模式装饰器模式适配器模式
核心目的控制对象访问简化复杂系统接口动态扩展对象功能接口兼容性转换
结构特点代理与真实对象实现相同接口外观类聚合多个子系统接口装饰器模式聚合被装饰对象适配器模式聚合被适配对象
对象关系代理对象持有真实对象外观持有多个子系统对象装饰器包裹原始对象适配器持有或继承被适配对象
接口一致性保持与真实对象接口一致提供新的简化接口保持与原始对象接口一致转换接口以匹配目标需求
扩展方向访问控制逻辑接口简化与整合功能叠加接口适配

http://www.ppmy.cn/news/1583232.html

相关文章

【C语言】多进程/多线程

【C语言】多进程/多线程 参考链接多进程/多线程服务器1. 多进程服务器2. 多线程服务器 结语参考链接 参考链接 c 中文网 菜鸟 c 多进程/多线程服务器 多进程和多线程是常用的并发编程技术。它们都允许程序同时执行多个任务,提高了系统的资源利用率和程序的运行效率…

git-lfs: command not found

遇到 git-lfs: command not found 错误,表示你的系统中未安装 Git Large File Storage (LFS) 扩展工具。以下是针对不同操作系统的解决方案: 1. 安装 Git LFS 根据你的操作系统选择安装方式: macOS 使用 Homebrew(推荐&#xff…

MATLAB 中,并行池(Parallel Pool)自动关闭的情况

在 MATLAB 中,并行池(Parallel Pool)的行为可以通过设置进行控制,但默认情况下,并行池不会自动关闭,除非满足某些条件或显式调用关闭命令。以下是关于并行池自动关闭机制的详细说明: 自动关闭的…

19926 分球

19926 分球 ⭐️考点:数学、排列组合 🌟难度:简单 📖 📚 import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {static long[][] dp ne…

盛铂科技SPP5006/18/40G峰值脉冲功率计探头 国产功率计

功率计简述 SPP5000系列是盛铂科技自主开发的自带USB 接口的多功能便携式数字脉冲峰值功率计,可快速执行50MHz至40GHz频率范围和-20dBm至20dBm动态范围的设置和测量,SPP5000系列具备脉冲信号测量与连续波信号测量能力。系统内置等效24Bit 高速采样ADC 并…

小程序跳转到h5页面

本组件使用useState、WebView、Taro的钩子,以及taro-hooks中的useRouter。组件内部使用了useRouter获取路由信息,从存储中获取openId和TOKEN,然后通过useReady生命周期钩子设置URL。分享功能部分使用useShareAppMessage处理,构建分…

关于CNN,RNN,GAN,GNN,DQN,Transformer,LSTM,DBN你了解多少

以下是神经网络中常见的几种模型的简要介绍: 1. ​CNN (Convolutional Neural Network, 卷积神经网络) ​用途: 主要用于图像处理和计算机视觉任务。​特点: 通过卷积核提取局部特征,具有平移不变性,能够有效处理高维数据(如图像…

智能汽车图像及视频处理方案,支持视频实时拍摄特效能力

在智能汽车日新月异的今天,美摄科技作为智能汽车图像及视频处理领域的先行者,凭借其卓越的技术实力和前瞻性的设计理念,为全球智能汽车制造商带来了一场视觉盛宴的革新。美摄科技推出智能汽车图像及视频处理方案,一个集高效性、智…