23种设计模式 - 代理模式

发布于:2025-02-20 ⋅ 阅读:(29) ⋅ 点赞:(0)

模式定义

代理模式(Proxy Pattern)是一种结构型设计模式,通过引入代理对象控制对真实对象的访问。代理在客户端和真实对象之间充当中间层,常用于权限控制、延迟加载或远程访问等场景。


模式结构

抽象主题(Subject):定义真实对象和代理的公共接口(如数控系统的操作接口)。
真实主题(RealSubject):实现核心功能(如数控机床的实际操作)。
代理(Proxy):持有真实主题的引用,控制访问并添加额外逻辑(如权限校验)。


适用场景

控制敏感操作权限(如数控系统的启动需验证用户身份)。
实现延迟加载(如仅在需要时初始化高开销对象)。
远程服务调用(如通过网络代理访问数控设备)。


C++示例(数控系统场景)

场景说明:
数控系统需要控制机床的启动权限,只有授权用户才能执行启动操作。

#include 
#include 
#include 

// 抽象主题:机床操作接口
class MachineSystem {
public:
    virtual ~MachineSystem() = default;
    virtual void start() = 0;
};

// 真实主题:数控机床实现
class CNCMachine : public MachineSystem {
public:
    void start() override {
        std::cout << "数控机床启动:开始加工零件..." << std::endl;
    }
};

// 代理:权限控制代理
class MachineProxy : public MachineSystem {
private:
    std::unique_ptr realMachine;
    std::string username;
    std::string password;

public:
    MachineProxy(const std::string& user, const std::string& pwd)
        : username(user), password(pwd) {
        realMachine = std::make_unique();
    }

    void start() override {
        if (authenticate()) {
            realMachine->start();
        } else {
            throw std::runtime_error("权限不足:启动被拒绝");
        }
    }

private:
    bool authenticate() {
        // 模拟权限验证(实际可能连接数据库或LDAP)
        return (username == "admin" && password == "admin123");
    }
};

// 客户端
int main() {
    try {
        // 用户通过代理访问数控机床
        std::unique_ptr proxy = 
            std::make_unique("admin", "admin123");
        proxy->start();  // 成功启动

        // 非法用户尝试
        std::unique_ptr invalidProxy = 
            std::make_unique("guest", "123");
        invalidProxy->start();  // 抛出异常
    } catch (const std::exception& e) {
        std::cerr << "错误: " << e.what() << std::endl;
    }
    return 0;
}

代码解析
抽象主题 MachineSystem 定义机床操作的统一接口。
真实主题 CNCMachine 实现实际的启动逻辑。
代理类 MachineProxy 在调用 start() 前执行权限验证,控制对真实对象的访问。


模式优势

权限隔离:保护真实对象不被非法访问(如数控系统的敏感操作)。
职责分离:代理类处理非核心逻辑(如日志、验证),真实主题专注业务。