代理模式(Proxy Pattern)

定义

代理模式(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 方法中,它控制着对真实主题对象的访问,并在必要时创建真实主题对象。
  • 客户端通过调用 Proxyrequest 方法来访问真实主题对象。

代理模式的优点在于:

  1. 远程代理: 通过代理对象可以实现对远程对象的访问,例如网络上的对象。
  2. 虚拟代理: 在需要时创建和初始化真实对象,以提高系统的性能和减少资源消耗。
  3. 安全代理: 控制对真实对象的访问,可以添加额外的安全性控制。

代理模式通常应用于以下情况:

  • 远程代理: 当客户端需要访问远程对象时,可以使用代理模式在本地创建一个代理对象来访问远程对象。
  • 虚拟代理: 当创建和初始化真实对象的开销较大时,可以使用代理模式延迟对象的创建和初始化,直到需要时再进行。
  • 安全代理: 当需要对真实对象的访问进行额外的安全控制时,可以使用代理模式来控制对真实

生活应用示例

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 方法中,它检查是否有权限,如果有权限则通过代理打开门,否则拒绝访问。

这个例子模拟了一个简单的门禁系统,其中代理类在访问真实门之前进行了权限检查。这类场景中的代理模式可以在生活中的各种情况下发挥作用,例如权限管理、缓存控制等。

相关推荐
Auc242 天前
OJ判题系统第4期之判题机模块架构——设计思路、实现步骤、代码实现(工厂模式、代理模式的实践)
java·spring cloud·log4j·mybatis·代理模式·工厂模式
Yang三少喜欢撸铁3 天前
【阿里云免费领取域名以及ssl证书,通过Nginx反向代理web服务】
nginx·阿里云·代理模式·ssl
Blurpath3 天前
什么是静态住宅IP?为什么静态住宅IP能提高注册通过率?
网络·代理模式·ip代理·住宅ip
python算法(魔法师版)4 天前
JavaScript性能优化实战,从理论到落地的全面指南
开发语言·性能优化·前端框架·代理模式
常某某的好奇心7 天前
代理模式(Proxy Pattern)
代理模式
彬彬醤7 天前
全局网络:重构数字时代的连接范式
运维·服务器·网络·数据库·重构·代理模式
菜鸟破茧计划10 天前
穿越数据森林与网络迷宫:树与图上动态规划实战指南
网络·动态规划·代理模式
yy鹈鹕灌顶11 天前
动态规划算法精解(Java实现):从入门到精通
代理模式
帝锦_li12 天前
Java进阶--设计模式
观察者模式·单例模式·代理模式·抽象工厂模式·适配器模式·原型模式
工业甲酰苯胺16 天前
用远程代理模式轻松实现远程服务调用,打开编程新大门
代理模式