代理模式的定义
代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理模式可以提供对目标对象的控制访问,通过代理对象可以在访问实际对象之前或之后增加额外的逻辑。
代理模式的主要角色有:
- 抽象主题(Subject) :声明了目标对象和代理对象的共同接口。
- 真实主题(Real Subject) :定义了代理对象所代表的真实对象。
- 代理(Proxy) :持有一个引用,使得代理可以访问真实主题。代理可以控制对真实主题的访问,允许在真实对象调用前后执行一些操作。
代理模式的类型
-
远程代理(Remote Proxy) :为一个位于不同地址空间的对象提供局部代表。
-
虚拟代理(Virtual Proxy) :根据需要创建开销很大的对象。用它来存放实例化需要很长时间的真实对象。
-
保护代理(Protection Proxy) :控制对原始对象的访问。保护代理用于对象应该有不同访问权限的时候。
-
智能引用代理(Smart Reference Proxy) :当一个对象被访问时,提供一些额外的操作,比如引用计数、记录访问日志等。
代码示例
1、抽象主题(Subject)
class Subject {
public:
virtual void request() const = 0;
virtual ~Subject() = default;
};
2、真实主题(RealSubject)
// 真实主题
class RealSubject :public Subject
{
public:
void request() const override
{
std::cout << "RealSubject: Handling request." << std::endl;
}
};
RealSubject 类:继承自 Subject 并实现了 request 方法。在这个方法中,输出一条消息表明 RealSubject 正在处理请求。
3、代理(Proxy)
// 代理
class Proxy :public Subject
{
public:
Proxy() : realsubject(nullptr) {}
~Proxy()
{
delete realsubject;
}
void request() const override
{
ensureRealSubject();
std::cout << "Proxy: Logging the request." << std::endl;
realsubject->request();
}
private:
mutable RealSubject* realsubject;
// 延迟初始化
void ensureRealSubject() const
{
if (!realsubject)
{
realsubject = new RealSubject();
}
}
};
-
Proxy类:也是继承自Subject,并实现了request方法。- 构造函数:初始化
realSubject指针为nullptr,表示最开始没有创建RealSubject实例。 - 析构函数:删除
realSubject指针所指向的对象,防止内存泄漏。 request方法:首先调用ensureRealSubject方法,确保realSubject已经被创建。然后输出日志信息,最后调用realSubject的request方法。- 成员变量
mutable RealSubject* realSubject:这个指针指向RealSubject对象,并被声明为mutable,允许在const成员函数中修改。 ensureRealSubject方法:检查realSubject是否为空,如果为空则创建一个新的RealSubject实例。这个方法被声明为const,以便在const成员函数request中调用。使用延迟初始化(即在ensureRealSubject函数中初始化realSubject)可以延迟真实对象的创建,直到它真正需要时再创建。这种方式可以避免在代理对象创建时立即分配不必要的资源,尤其是在真实对象创建开销较大且可能不会被使用的情况下。
- 构造函数:初始化
4、客户端代码
int main() {
Proxy* proxy = new Proxy();
proxy->request();
delete proxy;
system("pause");
return 0;
}