赞
踩
代理模式(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
方法中,它检查是否有权限,如果有权限则通过代理打开门,否则拒绝访问。这个例子模拟了一个简单的门禁系统,其中代理类在访问真实门之前进行了权限检查。这类场景中的代理模式可以在生活中的各种情况下发挥作用,例如权限管理、缓存控制等。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。