软件开发经典设计模式:结构型-代理模式

代理模式(Proxy Pattern)是一种结构型设计模式,它通过创建代理类来控制对原对象的访问。代理模式为某个对象控制访问权,并提供一个与原对象相同的接口。这种模式可以简化或延迟对象的访问,并在某些情况下增加额外的职责。

核心思想

代理模式的核心思想是引入代理对象来控制对实际被代理对象(通常称为个人对象或实体)的访问。代理对象可以在访问这个实体对象之前、之后或期间执行某些操作,如权限控制、缓存、延迟加载等。

组成部分

  1. 主题接口(Subject)

    • 定义了实体对象和代理对象都需要实现的接口。
  2. 实体对象(RealSubject)

    • 实际执行业务逻辑的对象。
  3. 代理对象(Proxy)

    • 控制访问实体对象,在实体对象的前后提供额外功能。

代理类型

  • 虚拟代理:用于控制资源的访问,如延迟实例化大型对象。
  • 远程代理:为不同地址空间中的对象提供访问接口(如网络服务)。
  • 保护代理:用于控制对对象的访问权限。
  • 智能代理:能够在调用真实对象时提供额外的功能,比如引用计数和日志记录。
#include <iostream>
#include <memory>

// 主题接口
class Image {
public:
    virtual void display() const = 0;
    virtual ~Image() = default;
};

// 实体对象
class RealImage : public Image {
public:
    RealImage(const std::string& filename) : filename_(filename) {
        loadFromDisk();
    }

    void display() const override {
        std::cout << "Displaying " << filename_ << std::endl;
    }

private:
    void loadFromDisk() const {
        std::cout << "Loading " << filename_ << std::endl;
    }

    std::string filename_;
};

// 代理对象
class ProxyImage : public Image {
public:
    ProxyImage(const std::string& filename) : filename_(filename) {}

    void display() const override {
        if (!realImage_) {
            realImage_ = std::make_unique<RealImage>(filename_);
        }
        realImage_->display();
    }

private:
    mutable std::unique_ptr<RealImage> realImage_;
    std::string filename_;
};

int main() {
    std::unique_ptr<Image> image = std::make_unique<ProxyImage>("test.jpg");

    // 图像第一次显示时,需要加载
    image->display();

    // 多次调用 display 会复用已经加载的图片
    image->display();

    return 0;
}

特点和优点

  • 控制访问

    • 允许添加对被代理对象的访问控制和操作。
  • 性能优化

    • 通过延迟加载(虚拟代理)等手段,提高系统性能。
  • 权限管理

    • 可以用于实现权限管理和检查(保护代理)。
  • 减少负载

    • 通过使用缓存或减少独占资源利用率来优化性能。

使用场景

  • 资源访问管理

    • 比如需要控制某些敏感资源的访问,或者需要缓存数据进行性能优化的系统。
  • 延迟实例化

    • 使用虚拟代理延迟对象的创建以减少系统负担,尤其是在后台加载和初始化成本较高时。
  • 跨网络访问

    • 实现远程代理来处理对象在不同地址空间或进程间的通信。

代理模式是一个简单而有效的设计模式,特别适用于需要对重要对象的访问进行审核、优化或控制的应用中。它提供了极大的灵活性,同时保持了一致的接口使用体验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值