代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理,以控制对这个对象的访问。代理对象可以在不改变目标对象的情况下,增加额外的功能,比如安全检查、缓存等。
#include <iostream>
#include <string>
// 抽象主题
class Subject {
public:
virtual void request() = 0;
};
// 具体主题
class RealSubject : public Subject {
public:
void request() override {
std::cout << "RealSubject: Handling request." << std::endl;
}
};
// 代理
class Proxy : public Subject {
public:
Proxy(Subject* real_subject) : real_subject_(real_subject) {}
void request() override {
if (checkAccess()) {
real_subject_->request();
logAccess();
}
}
private:
bool checkAccess() {
std::cout << "Proxy: Checking access prior to firing a real request." << std::endl;
// 检查访问权限
return true;
}
void logAccess() {
std::cout << "Proxy: Logging the time of request." << std::endl;
// 记录访问日志
}
Subject* real_subject_;
};
int main() {
// 创建具体主题和代理
Subject* real_subject = new RealSubject;
Proxy* proxy = new Proxy(real_subject);
// 通过代理访问具体主题
proxy->request();
// 释放内存
delete real_subject;
delete proxy;
return 0;
}
在这个示例中,Subject 是抽象主题,定义了代理和具体主题的公共接口。RealSubject 是具体主题,实现了 request 方法来处理真正的请求。Proxy 是代理,它包含一个指向真正主题的指针,并实现了 request 方法来控制对真正主题的访问。在 request 方法中,代理首先通过 checkAccess 方法检查访问权限,然后调用真正主题的 request 方法,并最终通过 logAccess 方法记录访问日志。
优化:
在实现中,可以使用智能指针等技术来管理对象的生命周期,避免内存泄漏等问题。
在使用代理模式时,需要考虑代理和真正主题的接口一致性和兼容性,避免出现不兼容的情况。