代理模式核心是通过代理类控制对真实对象的访问,不改变原接口即可添加权限校验、日志等逻辑;其结构含抽象接口、真实对象和代理对象三部分,代理持真实对象引用并转发调用。
代理模式在C++中核心是用一个代理类(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_ptrproxy = std::make_unique (); std::cout << proxy->read("config.txt") << std::endl;
若不想为每个类手写代理,可用模板封装通用代理壳:
templateclass 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小时内与您取得联系。