定义
代理模式(Proxy Pattern)是一种结构型设计模式,其目的是为其他对象提供一个代理或占位符,以控制对这个对象的访问。代理类通常在客户端和目标对象之间起到中介的作用,用于控制对目标对象的访问,并在必要时添加额外的功能。
示例
cpp
#include <iostream>
// 抽象主题接口
class Subject {
public:
virtual void request() = 0;
};
// 具体主题类
class RealSubject : public Subject {
public:
void request() override {
std::cout << "RealSubject: Handling request\n";
}
};
// 代理类
class Proxy : public Subject {
private:
RealSubject* realSubject;
public:
Proxy() : realSubject(nullptr) {}
void request() override {
// 在需要时创建真实主题对象
if (!realSubject) {
realSubject = new RealSubject();
}
// 通过代理访问真实主题对象
realSubject->request();
}
~Proxy() {
if (realSubject) {
delete realSubject;
}
}
};
// 客户端代码
int main() {
Proxy proxy;
proxy.request(); // 客户端通过代理访问真实主题对象
return 0;
}
在这个示例中:
Subject
是抽象主题接口,声明了真实主题类和代理类共同的操作。RealSubject
是具体主题类,实现了Subject
接口,是真正执行业务逻辑的对象。Proxy
是代理类,也实现了Subject
接口。在request
方法中,它控制着对真实主题对象的访问,并在必要时创建真实主题对象。- 客户端通过调用
Proxy
的request
方法来访问真实主题对象。
代理模式的优点在于:
- 远程代理: 通过代理对象可以实现对远程对象的访问,例如网络上的对象。
- 虚拟代理: 在需要时创建和初始化真实对象,以提高系统的性能和减少资源消耗。
- 安全代理: 控制对真实对象的访问,可以添加额外的安全性控制。
代理模式通常应用于以下情况:
- 远程代理: 当客户端需要访问远程对象时,可以使用代理模式在本地创建一个代理对象来访问远程对象。
- 虚拟代理: 当创建和初始化真实对象的开销较大时,可以使用代理模式延迟对象的创建和初始化,直到需要时再进行。
- 安全代理: 当需要对真实对象的访问进行额外的安全控制时,可以使用代理模式来控制对真实
生活应用示例
cpp
#include <iostream>
// 抽象主题接口
class Door {
public:
virtual void open() = 0;
virtual void close() = 0;
};
// 具体主题类 - 真实的门
class RealDoor : public Door {
public:
void open() override {
std::cout << "RealDoor: Opening the door\n";
}
void close() override {
std::cout << "RealDoor: Closing the door\n";
}
};
// 代理类 - 门禁系统
class SecurityProxy : public Door {
private:
RealDoor* realDoor;
bool isAuthorized;
public:
SecurityProxy() : realDoor(nullptr), isAuthorized(false) {}
void open() override {
// 在需要时创建真实门对象
if (!realDoor) {
realDoor = new RealDoor();
}
// 检查权限
if (isAuthorized) {
// 如果有权限,则通过代理打开门
realDoor->open();
} else {
std::cout << "SecurityProxy: Access denied! You are not authorized.\n";
}
}
void close() override {
// 通过代理关闭门
if (realDoor) {
realDoor->close();
}
}
// 设置授权状态
void authorize(bool status) {
isAuthorized = status;
}
~SecurityProxy() {
if (realDoor) {
delete realDoor;
}
}
};
// 客户端代码
int main() {
SecurityProxy securityProxy;
// 尝试打开门,但因为未授权,将拒绝访问
securityProxy.open();
// 授权
securityProxy.authorize(true);
// 现在可以打开门
securityProxy.open();
// 关闭门
securityProxy.close();
return 0;
}
在这个例子中:
Door
是抽象主题接口,声明了门的开和关的操作。RealDoor
是具体主题类,实现了Door
接口,表示真实的门。SecurityProxy
是代理类,同样实现了Door
接口。在open
方法中,它检查是否有权限,如果有权限则通过代理打开门,否则拒绝访问。
这个例子模拟了一个简单的门禁系统,其中代理类在访问真实门之前进行了权限检查。这类场景中的代理模式可以在生活中的各种情况下发挥作用,例如权限管理、缓存控制等。