全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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 接口编程:

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 就失去替换性和扩展性。


# c++  # proxy  # 延迟加载  # 封装  # 指针  # 接口  # 泛型  # 对象  # 加载  # 首次  # 在此  # 只需  # 并在  # 为例  # 又能  # 若不  # 既不  # 想对 


相关文章: 建站之星如何防范黑客攻击与数据泄露?  大连网站制作公司哪家好一点,大连买房网站哪个好?  如何确保西部建站助手FTP传输的安全性?  湖北网站制作公司有哪些,湖北清能集团官网?  宝塔面板创建网站无法访问?如何快速排查修复?  如何通过.red域名打造高辨识度品牌网站?  如何快速生成高效建站系统源代码?  高防服务器如何保障网站安全无虞?  婚礼视频制作网站,学习*后期制作的网站有哪些?  济南专业网站制作公司,济南信息工程学校怎么样?  建站之星如何实现网站加密操作?  建站之星如何修改网站生成路径?  如何通过服务器快速搭建网站?完整步骤解析  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  实现虚拟支付需哪些建站技术支撑?  如何解决ASP生成WAP建站中文乱码问题?  如何用狗爹虚拟主机快速搭建网站?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站VPS能否同时实现高效与安全翻墙?  如何用免费手机建站系统零基础打造专业网站?  建站之星安装后如何配置SEO及设计样式?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  如何用PHP工具快速搭建高效网站?  高防服务器租用首荐平台,企业级优惠套餐快速部署  Android自定义listview布局实现上拉加载下拉刷新功能  javascript基本数据类型及类型检测常用方法小结  招商网站制作流程,网站招商广告语?  在线制作视频网站免费,都有哪些好的动漫网站?    车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  历史网站制作软件,华为如何找回被删除的网站?  建站之星云端配置指南:模板选择与SEO优化一键生成  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  Swift开发中switch语句值绑定模式  建设网站制作价格,怎样建立自己的公司网站?  个人网站制作流程图片大全,个人网站如何注销?  如何通过免费商城建站系统源码自定义网站主题与功能?  c# 在ASP.NET Core中管理和取消后台任务  如何挑选高效建站主机与优质域名?  北京网站制作网页,网站升级改版需要多久?  如何在宝塔面板创建新站点?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  如何在局域网内绑定自建网站域名?  教学论文网站制作软件有哪些,写论文用什么软件 ?  音响网站制作视频教程,隆霸音响官方网站?  独立制作一个网站多少钱,建立网站需要花多少钱? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。