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

代理设计模式用于控制对某个对象的访问,常用于延迟加载、权限校验、日志记录或远程调用等场景。C++ 中实现代理模式有多种方式,核心是通过一个代理类来代替真实对象,对外提供相同接口,内部决定是否转发请求。
代理类和真实类实现同一个接口,代理持有真实对象的指针,客户通过代理访问真实对象。
#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,无需知道背后是否已创建真实对象。
利用 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(); // 自动触发检查并转发
真实对象构造开销大时,代理可延迟其创建,直到真正需要时才初始化。
上面的 Proxy 示例已经实现了虚拟代理:仅在第一次调用 request() 时创建 RealSubject。
代理可在调用前检查用户权限,决定是否放行。
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();
}};
根据运行时条件控制访问,适合安全敏感场景。
虽然 C++ 不像 Java 那样内置 RMI,但可通过代理模拟远程调用,序列化参数并通过网络发送。
简化示例:
class RemoteProxy : public Subject {
public:
void request() override {
std::cout << "RemoteProxy: 序列化请求并发送到服务器\n";
// 模拟网络调用
std::cout << "RemoteProxy: 接收响应\n";
}
};
实际中可结合 gRPC、Protobuf 或自定义通信协议实现。
通过模板减少重复代码,支持任意类型。
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++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号