【C++】代理模式

目录

  • 一、模式核心概念与结构
  • 二、C++ 实现示例:图像加载代理
  • 三、代理模式的关键特性
  • 四、代理模式的常见类型
  • 五、应用场景
  • 六、代理模式与其他设计模式的关系
  • 七、C++ 标准库中的代理模式应用
  • 八、优缺点分析
  • 九、实战案例:数据库连接代理
  • 十、实现注意事项
    • 如果这篇文章对你有所帮助,渴望获得你的一个点赞!

代理模式(Proxy Pattern)是一种【结构型】设计模式,它允许通过代理对象控制对另一个对象(目标对象)的访问。代理对象在客户端和目标对象之间充当中间层,负责处理与目标对象的交互,例如延迟加载、访问控制、缓存或日志记录等。

一、模式核心概念与结构

代理模式包含三个核心角色:

  1. 抽象主题(Subject):定义目标对象和代理对象的共同接口,客户端通过该接口与目标对象交互。
  2. 目标对象(Real Subject):实现抽象主题接口,提供实际的业务逻辑。
  3. 代理对象(Proxy):实现抽象主题接口,持有目标对象的引用,并在调用目标对象方法前后执行额外操作。

二、C++ 实现示例:图像加载代理

以下是一个经典的代理模式示例,演示如何使用代理模式实现图像的延迟加载:

#include 
#include 
#include 

// 抽象主题:图像
class Image {
   
public:
    virtual ~Image() = default;
    virtual void display() const = 0;
};

// 目标对象:真实图像
class RealImage : public Image {
   
private:
    std::string filename;

public:
    RealImage(const std::string& fname) : filename(fname) {
   
        loadFromDisk();
    }
    
    void display() const override {
   
        std::cout << "Displaying image: " << filename << std::endl;
    }
    
    // 模拟从磁盘加载图像(耗时操作)
    void loadFromDisk() const {
   
        std::cout << "Loading image: " << filename << std::endl;
    }
};

// 代理对象:图像代理
class ProxyImage : public Image {
   
private:
    std::string filename;
    mutable std::shared_ptr<RealImage> realImage;  // 延迟加载

public:
    ProxyImage(const std::string& fname) : filename(fname), realImage(nullptr) {
   }
    
    void display() const override {
   
        if (!realImage) {
   
            // 延迟加载:首次调用时才创建真实对象
            realImage = std::make_shared<RealImage>(filename

你可能感兴趣的:(设计模式,c++,代理模式,设计模式)