定义
代理模式(Proxy Pattern)是一种结构型设计模式,其目的是为其他对象提供一个代理或占位符,以控制对这个对象的访问。代理类通常在客户端和目标对象之间起到中介的作用,用于控制对目标对象的访问,并在必要时添加额外的功能。
示例
#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
方法来访问真实主题对象。
代理模式的优点在于:
- 远程代理: 通过代理对象可以实现对远程对象的访问,例如网络上的对象。
- 虚拟代理: 在需要时创建和初始化真实对象,以提高系统的性能和减少资源消耗。
- 安全代理: 控制对真实对象的访问,可以添加额外的安全性控制。
代理模式通常应用于以下情况:
- 远程代理: 当客户端需要访问远程对象时,可以使用代理模式在本地创建一个代理对象来访问远程对象。
- 虚拟代理: 当创建和初始化真实对象的开销较大时,可以使用代理模式延迟对象的创建和初始化,直到需要时再进行。
- 安全代理: 当需要对真实对象的访问进行额外的安全控制时,可以使用代理模式来控制对真实
生活应用示例
#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
方法中,它检查是否有权限,如果有权限则通过代理打开门,否则拒绝访问。
这个例子模拟了一个简单的门禁系统,其中代理类在访问真实门之前进行了权限检查。这类场景中的代理模式可以在生活中的各种情况下发挥作用,例如权限管理、缓存控制等。