当前位置: 首页 > ds >正文

设计模式十三:代理模式(Proxy Pattern)

代理模式是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。

代理模式的主要角色

  1. Subject(抽象主题):定义真实主题和代理主题的共同接口

  2. RealSubject(真实主题):实现真正的业务逻辑

  3. Proxy(代理):包含对真实主题的引用,可以控制对真实主题的访问

代理模式的类型

  1. 虚拟代理:延迟创建开销大的对象

  2. 远程代理:为远程对象提供本地代表

  3. 保护代理:控制对原始对象的访问权限

  4. 智能引用代理:在访问对象时执行附加操作(如引用计数)

 代码示例

#include <iostream>
#include <memory>
#include <string>// 抽象主题
class Image {
public:virtual ~Image() = default;virtual void display() = 0;
};// 真实主题
class RealImage : public Image {
public:RealImage(const std::string& filename) : filename(filename) {loadFromDisk();}void display() override {std::cout << "Displaying " << filename << std::endl;}private:void loadFromDisk() {std::cout << "Loading " << filename << " from disk" << std::endl;}std::string filename;
};// 代理
class ProxyImage : public Image {
public:ProxyImage(const std::string& filename) : filename(filename), realImage(nullptr) {}void display() override {if (realImage == nullptr) {realImage = std::make_unique<RealImage>(filename);}realImage->display();}private:std::string filename;std::unique_ptr<RealImage> realImage;
};// 使用示例
int main() {ProxyImage image1("photo1.jpg");ProxyImage image2("photo2.jpg");// 图像第一次显示时会从磁盘加载image1.display();// 图像已经加载过,直接从内存显示image1.display();// 另一个图像第一次显示image2.display();return 0;
}

UML结构

 

 要点总结

1、“增加一层间接层”是软件系统中对许多复杂问题的一种常见解决方法。在面向对象系统中,直接使用某些对象会带来很多问题,作为间接层的proxy对象便是解决这一问题的常用手段。
2、具体proxy设计模式的实现方法、实现粒度都相差很大,有些可能对单个对象做细粒度的控制,如copy-on-write技术,有些可能对组件模块提供抽象代理层,在架构层次对对象做proxy。
3、Proxy并不一定要求保持接口完整的一致性,只要能够实现间接控制,有时候损及一些透明性是可以接受的。

代理模式的优点

  1. 可以控制对真实对象的访问

  2. 作为真实对象和客户端之间的中介,可以增加额外的功能

  3. 可以延迟真实对象的创建和初始化

  4. 可以实现远程访问

代理模式的缺点

  1. 可能会引入额外的复杂度

  2. 可能会增加响应时间(因为多了一层代理)

适用场景

  1. 需要延迟加载(Lazy Initialization)时

  2. 需要控制对原始对象的访问权限时

  3. 需要为远程对象提供本地接口时

  4. 需要为对象访问添加日志或监控时

 

http://www.xdnf.cn/news/16704.html

相关文章:

  • mac 字体遍历demo
  • 网络原理 - TCP/IP(一)
  • 大数据集分页优化:LIMIT OFFSET的替代方案
  • 解密数据结构之二叉树
  • 解锁全球数据:Bright Data MCP 智能解决代理访问难题
  • 84、【OS】【Nuttx】【启动】栈溢出保护:asm 关键字(下)
  • 使用jQuery时的注意事项
  • 网络安全运维面试准备
  • 2025年科研算力革命:8卡RTX 5090服务器如何重塑AI研究边界?
  • 外星人笔记本装win11哪个版本好_外星人笔记本装win11专业版教程
  • Java中的异常判断以及文件中的常用方法及功能
  • Django-environ 入门教程
  • 镜像源加速下载
  • 在WSL中配置VS Code C++开发环境完整教程
  • linux中简易云盘系统项目实战:基于 TCP协议的 Socket 通信、json数据交换、MD5文件区别与多用户文件管理实现
  • 《C++初阶之STL》【list容器:详解 + 实现】
  • 低速信号设计之 UART 篇
  • 鸿蒙网络编程系列59-仓颉版TLS回声服务器示例
  • 如何迁移gitlab到另一台服务器
  • 图像认知与OpenCV | Day5:图像预处理(4)
  • C++20协程实战:高效网络库、手机终端、多媒体开发开发指南
  • Javaweb - 13 - AJAX
  • Qt|槽函数耗时操作阻塞主界面问题
  • Chrome 提示 “此扩展程序不再受支持”(MacOS/Windows)
  • WindowsAPI|每天了解几个winAPI接口之网络配置相关文档Iphlpapi.h详细分析六
  • C++异常捕获:为何推荐按引用(by reference)捕获?
  • 华为昇腾芯片:多模态模型国产化的硬核突破
  • Ext JS极速项目之 Coworkee
  • ETH 交易流程深度技术详解
  • Linux进程概念(五)进程地址空间