代理模式(Proxy Pattern)是一种结构型设计模式,它允许通过代理对象控制对另一个对象的访问。代理通常充当客户端和实际对象之间的中介,可以在访问实际对象之前或之后执行额外的操作。
下面是一个使用C++和Qt框架演示代理模式的示例:
演示代码:
#include <QCoreApplication>
#include <QDebug>
// 抽象主题类
class Subject {
public:
// 纯虚函数
virtual void request() = 0;
};
// 具体主题类
class RealSubject : public Subject {
public:
void request() override {
qDebug() << "RealSubject:处理请求";
}
};
// 代理类 继承抽象主题类
class Proxy : public Subject {
private:
RealSubject* realSubject;
public:
// 创建具体主题类对象
Proxy() : realSubject(new RealSubject) {}
// 重写抽象主题类函数,在里面可以做一些关于具体主题类的操作
void request() override {
// 在访问实际对象之前或之后可以执行额外的操作
qDebug() << "Proxy: Logging request.";
realSubject->request();
qDebug() << "Proxy: Request handled.";
}
};
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
Proxy proxy;
proxy.request();
return a.exec();
}
在这个示例中,我们定义了一个抽象主题类Subject
,具体主题类RealSubject
实现了抽象主题类的方法。Proxy
类充当代理,内部持有一个RealSubject
对象,并在访问RealSubject
之前或之后执行额外的操作。
在main
函数中,我们创建了一个Proxy
对象,并调用其request
方法来处理请求。代理在处理请求时会先执行日志记录操作,然后将请求转发给实际的主题对象RealSubject
进行处理。
代理模式的优点:
-
远程代理(Remote Proxy): 可以通过代理对象在不同地址空间中代表实际对象,使得客户端可以访问远程对象。
-
虚拟代理(Virtual Proxy): 可以延迟实际对象的创建和初始化,提高系统性能。
-
保护代理(Protection Proxy): 可以控制对实际对象的访问权限,实现安全性控制。
-
简化客户端: 代理模式可以隐藏实际对象的复杂性,使客户端代码更简洁。
代理模式的缺点:
-
增加复杂性: 引入代理对象会增加系统的复杂性,特别是当存在多层代理时。
-
性能损失: 由于代理对象的存在,可能会引入额外的开销,影响系统性能。
-
过度使用: 如果过度使用代理模式,可能会导致系统中存在过多的代理对象,使得系统变得难以维护和理解。
代理模式适用于需要控制对对象的访问、延迟加载、权限控制等情况。在使用代理模式时,需要根据具体的需求来选择合适的代理类型,并确保代理对象的引入不会引起系统的复杂性和性能问题。