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

代理模式 - 代理模式的应用

引言

代理模式(Proxy Pattern)是一种结构型设计模式,它允许你提供一个代理对象来控制对另一个对象的访问。代理对象通常会在客户端和目标对象之间起到中介的作用,从而可以在不改变目标对象的情况下,增加额外的功能或控制访问。本文将详细介绍如何在C++中实现代理模式,并通过示例代码帮助读者理解其应用场景。

代理模式的基本概念

代理模式的核心思想是通过引入一个代理对象来控制对目标对象的访问。代理对象通常会在客户端和目标对象之间起到中介的作用,从而可以在不改变目标对象的情况下,增加额外的功能或控制访问。

代理模式的角色

  1. Subject(抽象主题):定义目标对象和代理对象的共同接口,这样代理对象可以在任何地方替代目标对象。
  2. RealSubject(真实主题):定义目标对象,它是代理对象所代表的真实对象。
  3. Proxy(代理):包含一个指向真实主题的引用,并实现与真实主题相同的接口。代理对象可以在调用真实主题的方法前后执行一些额外的操作。

C++实现代理模式

1. 定义抽象主题类

首先,我们定义一个抽象主题类 Subject,它包含目标对象和代理对象的共同接口。

#include <iostream>
#include <memory>

// 抽象主题类
class Subject {
public:
    virtual ~Subject() = default;
    virtual void request() const = 0;
};

2. 定义真实主题类

接下来,我们定义一个真实主题类 RealSubject,它继承自 Subject 并实现 request 方法。

// 真实主题类
class RealSubject : public Subject {
public:
    void request() const override {
        std::cout << "RealSubject: Handling request." << std::endl;
    }
};

3. 定义代理类

然后,我们定义一个代理类 Proxy,它也继承自 Subject,并实现 request 方法。代理类中包含一个指向真实主题的引用,并在调用真实主题的方法前后执行一些额外的操作。

// 代理类
class Proxy : public Subject {
public:
    Proxy(std::shared_ptr<RealSubject> real_subject) : real_subject_(real_subject) {}

    void request() const override {
        if (checkAccess()) {
            real_subject_->request();
            logAccess();
        }
    }

private:
    bool checkAccess() const {
        std::cout << "Proxy: Checking access prior to firing a real request." << std::endl;
        return true;
    }

    void logAccess() const {
        std::cout << "Proxy: Logging the time of request." << std::endl;
    }

    std::shared_ptr<RealSubject> real_subject_;
};

4. 使用代理模式

最后,我们通过一个简单的示例来演示如何使用代理模式。

int main() {
    // 创建真实主题对象
    auto real_subject = std::make_shared<RealSubject>();

    // 创建代理对象
    auto proxy = std::make_shared<Proxy>(real_subject);

    // 通过代理对象调用请求
    proxy->request();

    return 0;
}

5. 运行结果

运行上述代码,输出结果如下:

Proxy: Checking access prior to firing a real request.
RealSubject: Handling request.
Proxy: Logging the time of request.

代理模式的应用场景

代理模式在实际开发中有广泛的应用,以下是一些常见的应用场景:

  1. 远程代理:为一个位于不同地址空间的对象提供一个本地代表。例如,客户端可以通过远程代理访问远程服务器上的对象。
  2. 虚拟代理:根据需要创建开销很大的对象。例如,在加载大图片时,可以使用虚拟代理来延迟图片的加载,直到真正需要显示图片时才加载。
  3. 保护代理:控制对原始对象的访问权限。例如,可以在代理对象中检查客户端的权限,只有具有相应权限的客户端才能访问目标对象。
  4. 智能引用:在访问对象时执行一些额外的操作。例如,可以在代理对象中记录对象的访问次数,或者在对象被释放时自动释放相关资源。

总结

代理模式通过引入一个代理对象来控制对目标对象的访问,从而可以在不改变目标对象的情况下,增加额外的功能或控制访问。这种模式在处理远程对象、延迟加载、权限控制等场景时非常有用。通过本文的示例代码,读者可以更好地理解如何在C++中实现代理模式,并将其应用到实际项目中。

希望本文对你理解代理模式有所帮助!如果你有任何问题或建议,欢迎在评论区留言讨论。


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

相关文章:

  • 基于 RAMS 的数据驱动建模与应用实践:从理论到具体操作
  • 爬山算法与模拟退火算法的全方面比较
  • 基于OSAL的嵌入式裸机事件驱动框架——消息队列osal_msg
  • 修改docker共享内存shm-size
  • 定时器按键tim_key模版
  • MySQL数据库笔记——版本号机制和CAS(Compare And Swap)
  • windows11关闭系统更新详细操作步骤
  • 2025数学建模美赛|赛题翻译|E题
  • 使用vitepress搭建自己的博客项目
  • 力扣算法题——202.快乐数【系统讲解】
  • Vscode+Pico+MicroPython 开发流程简介
  • 单片机开发:流水灯、蜂鸣器
  • CIMRTS材质美化--放大采样、缩小采样
  • ThinkPHP 8 操作JSON数据
  • C语言--分支循环实践:猜数字游戏
  • cuda reductionreduce
  • 如何使用 SQL CREATE TABLE 创建一个表
  • 【机器学习】自定义数据集使用scikit-learn中的包实现线性回归方法对其进行拟合
  • 浅谈贪心算法
  • 【PySide6快速入门】PySide6构建Qt项目
  • Java Web-Request与Response
  • Spring MVC (三) —— 实战演练
  • 什么是Pytest Fixtures作用域及如何为Pytest Fixtures设置合适的作用域
  • Arduino大师练成手册 -- PCF8574T I2C控制LCD1602
  • 【云安全】云原生-Docker(五)容器逃逸之漏洞利用
  • GMP底层