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

C++ 设计模式:代理模式(Proxy Pattern)

链接:C++ 设计模式
链接:C++ 设计模式 - 门面模式
链接:C++ 设计模式 - 中介者
链接:C++ 设计模式 - 适配器

代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理以控制(隔离,使用接口)对这个对象的访问。代理模式可以在不改变目标对象的情况下,通过代理对象来控制对目标对象的访问。

1.问题分析

在开发中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者、或者系统结构带来很多麻烦。如何在不失去透明操作对象的同时来管理、控制这些对象特有的复杂性?增加一层间接层是软件开发中常见的解决方式。

2.实现步骤

  1. 定义抽象主题接口:定义目标对象和代理对象的共同接口。
  2. 定义真实主题类:实现抽象主题接口,定义目标对象的具体行为。
  3. 定义代理类:实现抽象主题接口,包含对真实主题对象的引用,控制对真实主题对象的访问。
  4. 客户端代码:通过代理对象来访问目标对象的功能。

3.代码示例

假设传感器的初始化过程可能涉及复杂的硬件配置、校准、数据加载等操作,这些操作可能需要较长的时间。如果在系统启动时同步初始化所有传感器,可能会导致系统资源紧张,影响其他任务的执行。这可以采用延迟初始化的方式,来缓解对系统性能的影响。

3.1.定义抽象主题接口

class Sensor {
 public:
  virtual ~Sensor() = default;
  virtual void readData() = 0;
};

3.2.定义真实主题类

class RealSensor : public Sensor {
 public:
  RealSensor() { initialize(); }

  void readData() override { std::cout << "Reading sensor data..." << std::endl; }

 private:
  void initialize() {
    std::cout << "Initializing sensor..." << std::endl;
    // 模拟初始化开销
  }
};

3.3.定义代理类

class ProxySensor : public Sensor {
 public:
  ProxySensor() : realSensor_(nullptr) {}

  void readData() override {
    if (!realSensor_) {
      realSensor_ = std::make_unique<RealSensor>();
    }
    realSensor_->readData();
  }

 private:
  std::unique_ptr<RealSensor> realSensor_;
};

3.4.客户端代码

int main() {
  std::unique_ptr<Sensor> sensor = std::make_unique<ProxySensor>();

  // 传感器尚未初始化
  std::cout << "Sensor not initialized yet." << std::endl;

  // 第一次读取传感器数据,传感器将被初始化
  sensor->readData();

  // 第二次读取传感器数据,传感器不需要再次初始化
  sensor->readData();

  return 0;
}

http://www.kler.cn/a/458884.html

相关文章:

  • python数据分析:使用pandas库读取和编辑Excel表
  • 基于 SensitiveWordBs 实现敏感词过滤功能
  • 【C++】: std::tie 用法详解
  • 移动端如何实现上拉加载
  • perl:多线程 简单示例
  • 在 IntelliJ IDEA 中开发 GPT 自动补全插件
  • 力扣第116题:填充每个节点的下一个右侧节点指针 - C语言解法
  • 代码随想录day21 | leetcode 77.组合 77.组合 加剪枝操作 216.组合总和III
  • [图形渲染]【Unity Shader】【游戏开发】 Shader数学基础17-法线变换基础与应用
  • Java:192 基于SSM框架的失物招领信息管理系统
  • debian12安装docker
  • Linux的进程替换以及基础IO
  • 初学stm32 --- 高级定时器PWM输入模式
  • Github 2024-12-26 Go开源项目日报 Top10
  • (二)当人工智能是一个函数时,怎么去训练它?
  • 【机器学习】机器学习的基本分类-半监督学习-Ladder Networks
  • 【day20】集合深入探讨
  • Optional类:避免NullPointerException
  • Go语言的字符串处理
  • 每天40分玩转Django:Django Channels
  • react-native键盘遮盖底部输入框问题修复
  • 对于多个网站的爬虫管理和配置支持
  • 前端处理跨域的几种方式
  • AI 加持下的智能家居行业:变革、挑战与机遇
  • 深度学习-78-大模型量化之Quantization Aware Training量化感知训练QAT
  • LeetCode每日三题(五)双指针