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

设计模式十三:代理模式(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.dtcms.com/a/303990.html

相关文章:

  • pygame 模拟放飞气球
  • hive专题面试总结
  • Python 日期时间格式化与解析的瑞士军刀:`strftime()` 与 `strptime()`
  • 三、Linux用户与权限管理详解
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现各种食物的类型检测识别(C#代码UI界面版)
  • 学习嵌入式的第三十四天-数据结构-(2025.7.29)数据库
  • 小杰数据结构(one day)——心若安,便是晴天;心若乱,便是阴天。
  • 【数据可视化-75】北京密云区2025年7月暴雨深度分析:Python + Pyecharts 炫酷大屏可视化(含完整数据、代码)
  • Prometheus + Grafana + Micrometer 监控方案详解
  • Java:为什么需要通配符捕获(wildcard capture)
  • HbuilderX开发小程序
  • 定制开发开源AI智能名片S2B2C商城小程序对流量重构与价值提升的作用研究
  • 使用git托管keil工程
  • React函数组件的“生活管家“——useEffect Hook详解
  • C++:stack与queue的使用
  • 40+个常用的Linux指令——下
  • 基于变频与移相混合控制(PFM+PSM)的全桥LLC谐振变换器仿真模型
  • 机械臂抓取的无模型碰撞检测代码
  • 仿函数+优先级队列priority_queue的模拟实现
  • P2910 [USACO08OPEN] Clear And Present Danger S
  • AutoGen Agent 使用指南
  • 华为HCIA-Cloud Service 从知识到实践的学习指南
  • SQL排查、分析海量数据以及锁机制
  • WebRTC(十四):WebRTC源码编译与管理
  • Webpack 优化策略
  • 如何用即构ZEGO SDK和uni-app开发一款直播带货应用?
  • uniapp 如果进入页面输入框自动聚焦,此时快速返回页面或者跳转到下一个页面,输入法顶上来的页面出现半屏的黑屏问题。
  • 使用JavaScript实现轮播图的任意页码切换和丝滑衔接切换效果
  • uniapp 实现全局变量
  • 【数据结构】用堆实现排序