首页 > 后端开发 > C++ > 正文

c++如何实现一个代理设计模式_c++控制对象访问的多种方式

裘德小鎮的故事
发布: 2025-12-04 11:17:02
原创
180人浏览过
代理模式通过代理类控制对真实对象的访问,常用于延迟加载、权限校验等场景。1. 经典代理中,代理类与真实类实现同一接口,代理持有真实对象指针并决定是否转发请求;2. 智能指针结合运算符重载可实现透明代理,如重载->操作符以拦截访问;3. 虚拟代理实现延迟初始化,仅在首次使用时创建昂贵对象;4. 保护代理在调用前检查权限,确保安全访问;5. 远程代理模拟网络通信,将本地调用转化为远程请求;6. 模板可实现通用代理,减少重复代码并提升复用性。结合C++特性如智能指针和多态,代理模式能高效控制对象访问,关键在于明确拦截时机与资源管理。

c++如何实现一个代理设计模式_c++控制对象访问的多种方式

代理设计模式用于控制对某个对象的访问,常用于延迟加载、权限校验、日志记录或远程调用等场景。C++ 中实现代理模式有多种方式,核心是通过一个代理类来代替真实对象,对外提供相同接口,内部决定是否转发请求。

1. 经典代理模式(静态代理)

代理类和真实类实现同一个接口,代理持有真实对象的指针,客户通过代理访问真实对象。

#include <iostream>
#include <memory>
<p><strong>// 共同接口</strong>
class Subject {
public:
virtual ~Subject() = default;
virtual void request() = 0;
};</p><p><strong>// 真实对象</strong>
class RealSubject : public Subject {
public:
void request() override {
std::cout << "RealSubject: 处理请求\n";
}
};</p><p><strong>// 代理对象</strong>
class Proxy : public Subject {
private:
std::unique_ptr<RealSubject> realSubject;</p><p>public:
void request() override {
if (!realSubject) {
std::cout << "Proxy: 创建真实对象(懒加载)\n";
realSubject = std::make_unique<RealSubject>();
}
std::cout << "Proxy: 控制访问,开始请求\n";
realSubject->request();
std::cout << "Proxy: 请求完成\n";
}
};
登录后复制

使用时只需操作 Proxy,无需知道背后是否已创建真实对象。

2. 智能指针与透明代理

利用 C++ 智能指针和运算符重载,实现更透明的代理,比如自动资源管理或引用计数。

立即学习C++免费学习笔记(深入)”;

class TransparentProxy {
private:
    std::shared_ptr<RealSubject> ptr;
<p>public:
TransparentProxy() : ptr(std::make_shared<RealSubject>()) {}</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;"><strong>// 重载 -> 实现透明访问</strong>
RealSubject* operator->() {
    std::cout << "TransparentProxy: 访问前检查\n";
    return ptr.get();
}
登录后复制

};

这样可以直接像使用原生对象一样使用代理:

TransparentProxy proxy;
proxy->request();  // 自动触发检查并转发
登录后复制

3. 虚拟代理(延迟初始化)

真实对象构造开销大时,代理可延迟其创建,直到真正需要时才初始化。

上面的 Proxy 示例已经实现了虚拟代理:仅在第一次调用 request() 时创建 RealSubject

4. 保护代理(权限控制)

代理可在调用前检查用户权限,决定是否放行。

DubbingX智声云配
DubbingX智声云配

多情绪免费克隆AI音频工具

DubbingX智声云配 975
查看详情 DubbingX智声云配
class ProtectedProxy : public Subject {
private:
    std::unique_ptr<RealSubject> realSubject;
    bool hasPermission;
<p>public:
explicit ProtectedProxy(bool perm) : hasPermission(perm) {}</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">void request() override {
    if (!hasPermission) {
        std::cout << "ProtectedProxy: 拒绝访问,权限不足\n";
        return;
    }
    if (!realSubject) realSubject = std::make_unique<RealSubject>();
    realSubject->request();
}
登录后复制

};

根据运行时条件控制访问,适合安全敏感场景。

5. 远程代理模拟

虽然 C++ 不像 Java 那样内置 RMI,但可通过代理模拟远程调用,序列化参数并通过网络发送。

简化示例:

class RemoteProxy : public Subject {
public:
    void request() override {
        std::cout << "RemoteProxy: 序列化请求并发送到服务器\n";
        // 模拟网络调用
        std::cout << "RemoteProxy: 接收响应\n";
    }
};
登录后复制

实际中可结合 gRPC、Protobuf 或自定义通信协议实现。

6. 使用模板实现通用代理

通过模板减少重复代码,支持任意类型。

template<typename T>
class GenericProxy {
private:
    std::unique_ptr<T> obj;
<p>public:
template<typename... Args>
GenericProxy(Args&&... args) 
: obj(std::make_unique<T>(std::forward<Args>(args)...)) {}</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">T* operator->() {
    std::cout << "GenericProxy: 前置处理\n";
    return obj.get();
}

T& operator*() { return *obj; }
登录后复制

};

可代理任何具有公共接口的对象,提升复用性。

基本上就这些。代理模式在 C++ 中灵活多变,结合智能指针、模板和多态,能实现高效且安全的对象访问控制。关键在于明确控制点:是在调用前拦截、延迟创建,还是限制权限。不复杂但容易忽略细节,比如生命周期管理和线程安全。

以上就是c++++如何实现一个代理设计模式_c++控制对象访问的多种方式的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号