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

代理设计模式用于控制对某个对象的访问,常用于延迟加载、权限校验、日志记录或远程调用等场景。C++ 中实现代理模式有多种方式,核心是通过一个代理类来代替真实对象,对外提供相同接口,内部决定是否转发请求。
1. 经典代理模式(静态代理)
代理类和真实类实现同一个接口,代理持有真实对象的指针,客户通过代理访问真实对象。
#include #include// 共同接口class Subject {public:virtual ~Subject() = default;virtual void request() = 0;};
// 真实对象class RealSubject : public Subject {public:void request() override {std::cout << "RealSubject: 处理请求n";}};
// 代理对象class Proxy : public Subject {private:std::unique_ptr realSubject;
public:void request() override {if (!realSubject) {std::cout << "Proxy: 创建真实对象(懒加载)n";realSubject = std::make_unique();}std::cout <request();std::cout << "Proxy: 请求完成n";}};
使用时只需操作 Proxy,无需知道背后是否已创建真实对象。
2. 智能指针与透明代理
利用 C++ 智能指针和运算符重载,实现更透明的代理,比如自动资源管理或引用计数。
立即学习“C++免费学习笔记(深入)”;
class TransparentProxy {private: std::shared_ptr ptr;public:TransparentProxy() : ptr(std::make_shared()) {}
// 重载 -> 实现透明访问RealSubject* operator->() { std::cout << "TransparentProxy: 访问前检查n"; return ptr.get();}
};
这样可以直接像使用原生对象一样使用代理:
TransparentProxy proxy;proxy->request(); // 自动触发检查并转发
3. 虚拟代理(延迟初始化)
真实对象构造开销大时,代理可延迟其创建,直到真正需要时才初始化。
上面的 Proxy 示例已经实现了虚拟代理:仅在第一次调用 request() 时创建 RealSubject。
4. 保护代理(权限控制)
代理可在调用前检查用户权限,决定是否放行。
class ProtectedProxy : public Subject {private: std::unique_ptr realSubject; bool hasPermission;public:explicit ProtectedProxy(bool perm) : hasPermission(perm) {}
void request() override { if (!hasPermission) { std::cout << "ProtectedProxy: 拒绝访问,权限不足n"; return; } if (!realSubject) realSubject = std::make_unique(); realSubject->request();}
};
根据运行时条件控制访问,适合安全敏感场景。
5. 远程代理模拟
虽然 C++ 不像 Java 那样内置 RMI,但可通过代理模拟远程调用,序列化参数并通过网络发送。
简化示例:
class RemoteProxy : public Subject {public: void request() override { std::cout << "RemoteProxy: 序列化请求并发送到服务器n"; // 模拟网络调用 std::cout << "RemoteProxy: 接收响应n"; }};
实际中可结合 gRPC、Protobuf 或自定义通信协议实现。
6. 使用模板实现通用代理
通过模板减少重复代码,支持任意类型。
templateclass GenericProxy {private: std::unique_ptr obj;public:templateGenericProxy(Args&&... args) : obj(std::make_unique(std::forward(args)...)) {}
T* operator->() { std::cout << "GenericProxy: 前置处理n"; return obj.get();}T& operator*() { return *obj; }
};
可代理任何具有公共接口的对象,提升复用性。
基本上就这些。代理模式在 C++ 中灵活多变,结合智能指针、模板和多态,能实现高效且安全的对象访问控制。关键在于明确控制点:是在调用前拦截、延迟创建,还是限制权限。不复杂但容易忽略细节,比如生命周期管理和线程安全。
以上就是c++++如何实现一个代理设计模式_c++控制对象访问的多种方式的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1487767.html
微信扫一扫
支付宝扫一扫