0

0

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

尼克

尼克

发布时间:2025-12-20 17:35:31

|

626人浏览过

|

来源于php中文网

原创

代理模式核心是通过代理类控制对真实对象的访问,不改变原接口即可添加权限校验、日志等逻辑;其结构含抽象接口、真实对象和代理对象三部分,代理持真实对象引用并转发调用。

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 real_reader;
public:
    LoggingProxy() : real_reader(std::make_unique()) {}

    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++免费学习笔记(深入)”;

Anakin
Anakin

一站式 AI 应用聚合平台,无代码的AI应用程序构建器

下载
std::unique_ptr proxy = std::make_unique();
std::cout << proxy->read("config.txt") << std::endl;

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

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

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

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

    // 若需重载具体方法,可显式转发(推荐用于关键接口)
    template
    auto read(Args&&... args) -> decltype(std::declval().read(std::forward(args)...)) {
        std::cout << "[Proxy] Before read\n";
        auto result = target->read(std::forward(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 就失去替换性和扩展性。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1021

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

64

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

414

2025.12.29

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

0

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

10

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

32

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

14

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

42

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.9万人学习

C 教程
C 教程

共75课时 | 4.1万人学习

C++教程
C++教程

共115课时 | 12.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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