代理模式
代理模式是一种结构型设计模式,它允许通过代理对象控制对其他对象的访问。代理对象充当客户端和目标对象之间的中间人,可以在访问目标对象时进行一些额外的控制或处理。
使用场景
1、远程代理:当需要访问远程对象时,可以使用代理对象来隐藏网络通信的细节。
2、虚拟代理:当需要延迟创建目标对象,或者需要在访问目标对象时进行一些额外的处理时,可以使用代理对象来进行虚拟代理。
3、安全代理:当需要控制对目标对象的访问权限时,可以使用代理对象来进行安全代理。
4、智能引用:当需要在访问目标对象时进行一些额外的操作,比如引用计数、懒加载等时,可以使用代理对象来进行智能引用。
优势:
1、可以控制对目标对象的访问,实现了对目标对象的保护。
2、可以在访问目标对象时进行一些额外的处理,比如延迟加载、缓存等。
3、可以提高系统的灵活性和可扩展性,因为代理对象可以在不影响客户端的情况下对目标对象进行增强或修改。
劣势:
1、可能会增加系统的复杂性,因为需要创建大量的代理类。
2、可能会影响系统的性能,因为每次访问目标对象都需要经过代理对象。
#include <iostream>
// 抽象主题
class Subject {
public:
virtual void request() = 0;
};
// 具体主题
class RealSubject : public Subject {
public:
void request() {
std::cout << "RealSubject request" << std::endl;
}
};
// 代理
class Proxy : public Subject {
private:
RealSubject* realSubject;
public:
void request() {
if (realSubject == nullptr) {
realSubject = new RealSubject();
}
// 可以在访问真实主题之前进行一些额外的处理
std::cout << "Proxy request begin" << std::endl;
realSubject->request();
// 可以在访问真实主题之后进行一些额外的处理
std::cout << "Proxy request end" << std::endl;
}
};
int main() {
Proxy proxy;
proxy.request();
while (1);
return 0;
}