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

c++如何实现一个代理模式_c++结构型设计模式Proxy【详解】

尼克
发布: 2025-12-20 17:35:31
原创
626人浏览过
代理模式核心是通过代理类控制对真实对象的访问,不改变原接口即可添加权限校验、日志等逻辑;其结构含抽象接口、真实对象和代理对象三部分,代理持真实对象引用并转发调用。

c++如何实现一个代理模式_c++结构型设计模式proxy【详解】

代理模式在C++中核心是用一个代理类(Proxy)控制对真实对象(RealSubject)的访问,既不改变原接口,又能添加权限校验、延迟加载、日志记录等额外逻辑。

一、代理模式的基本结构

需要三部分协同工作:

  • 抽象接口(Subject):定义业务方法,供 Proxy 和 RealSubject 共同实现;
  • 真实对象(RealSubject):真正执行业务逻辑的类;
  • 代理对象(Proxy):持有一个 RealSubject 指针/引用,转发调用,并在前后插入控制逻辑。

二、经典静态代理实现(以文件读取为例)

假设我们想对文件读取操作加访问日志和权限检查:

class FileReader {
public:
    virtual ~FileReader() = default;
    virtual std::string read(const std::string& path) = 0;
};

class RealFileReader : public FileReader {
public:
    std::string read(const std::string& path) override {
        return "Content from " + path; // 真实读取逻辑
    }
};

class LoggingProxy : public FileReader {
private:
    std::unique_ptr<RealFileReader> real_reader;
public:
    LoggingProxy() : real_reader(std::make_unique<RealFileReader>()) {}

    std::string read(const std::string& path) override {
        std::cout << "[LOG] Accessing file: " << path << std::endl;
        // 可在此加权限判断:if (!hasPermission(path)) throw std::runtime_error("No access");
        return real_reader->read(path);
    }
};
登录后复制

使用时只需面向 FileReader 接口编程:

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

Supermeme
Supermeme

Supermeme是一个AI驱动的Meme生成器,可以快速生成有趣的Meme梗图

Supermeme 114
查看详情 Supermeme
std::unique_ptr<FileReader> proxy = std::make_unique<LoggingProxy>();
std::cout << proxy->read("config.txt") << std::endl;
登录后复制

三、智能指针+模板代理(支持任意类型)

若不想为每个类手写代理,可用模板封装通用代理壳:

template<typename T>
class GenericProxy {
private:
    std::unique_ptr<T> target;
public:
    explicit GenericProxy(std::unique_ptr<T> t) : target(std::move(t)) {}

    template<typename... Args>
    auto operator->() -> decltype(target.get()) {
        std::cout << "[Proxy] Forwarding call...\n";
        return target.get();
    }

    // 若需重载具体方法,可显式转发(推荐用于关键接口)
    template<typename... Args>
    auto read(Args&&... args) -> decltype(std::declval<T>().read(std::forward<Args>(args)...)) {
        std::cout << "[Proxy] Before read\n";
        auto result = target->read(std::forward<Args>(args)...);
        std::cout << "[Proxy] After read\n";
        return result;
    }
};
登录后复制

注意:这种泛型方式适合轻量包装,但无法完全替代接口抽象——强类型安全和开闭原则仍依赖基类接口。

四、常见变体与使用场景

远程代理(Remote Proxy):把本地调用转为网络请求(如 gRPC stub);
虚代理(Virtual Proxy):延迟初始化重量级对象(如大图加载器,首次调用才 new);
保护代理(Protection Proxy):运行时检查用户角色(如 admin-only 方法);
智能引用(Smart Reference):自动计数、释放或锁定(类似 std::shared_ptr 的附加语义)。

基本上就这些。代理模式不复杂但容易忽略接口抽象的重要性——没有统一 Subject,Proxy 就失去替换性和扩展性。

以上就是c++++如何实现一个代理模式_c++结构型设计模式Proxy【详解】的详细内容,更多请关注php中文网其它相关文章!

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

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

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

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