C++如何实现代理模式来控制对另一个对象的访问

来源:网站主作者:小诸葛头衔:草根站长
导读:本期聚焦于小伙伴创作的《C++如何实现代理模式来控制对另一个对象的访问》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C++如何实现代理模式来控制对另一个对象的访问》有用,将其分享出去将是对创作者最好的鼓励。

代理模式的核心思路是引入一个代理类,代理类和被代理对象实现相同的接口,客户端通过代理类间接访问被代理对象,代理类可以在访问前后添加额外的控制逻辑,从而实现对被代理对象的访问管控。

C++如何实现代理模式来控制对另一个对象的访问

代理模式的核心结构

代理模式通常包含三个核心角色:

  • 抽象主题(Subject):定义被代理对象和代理类共同实现的接口,确保客户端可以无差别地使用代理类和被代理对象。
  • 真实主题(RealSubject):实际处理业务逻辑的对象,也就是被代理的对象。
  • 代理(Proxy):持有真实主题的引用,实现抽象主题接口,在客户端调用时控制对真实主题的访问,可在调用前后添加额外操作。

基础代理模式实现示例

以下以文件访问场景为例,实现权限控制的代理模式,只有拥有权限的用户才能访问文件内容。

1. 定义抽象主题接口

首先定义文件操作的抽象接口,包含读取文件的方法:

// 抽象主题:文件操作接口
class FileOperator {
public:
    virtual ~FileOperator() = default;
    // 读取文件内容的方法
    virtual std::string readFile() = 0;
};

2. 实现真实主题类

真实主题类实现文件读取的实际逻辑:

// 真实主题:实际执行文件读取的类
class RealFileOperator : public FileOperator {
private:
    std::string fileName;
public:
    explicit RealFileOperator(std::string name) : fileName(std::move(name)) {}

    std::string readFile() override {
        // 模拟实际文件读取逻辑
        return "文件" + fileName + "的内容:这是一段示例文本数据";
    }
};

3. 实现代理类

代理类添加权限校验逻辑,只有校验通过才允许访问真实主题的方法:

// 代理类:控制文件访问权限
class FileProxy : public FileOperator {
private:
    RealFileOperator* realOperator;
    std::string userRole;
public:
    FileProxy(std::string name, std::string role) 
        : realOperator(new RealFileOperator(std::move(name))), userRole(std::move(role)) {}

    ~FileProxy() override {
        delete realOperator;
    }

    std::string readFile() override {
        // 访问前校验权限
        if (checkPermission()) {
            // 权限通过,调用真实主题的方法
            return realOperator->readFile();
        } else {
            return "权限不足,无法访问该文件";
        }
    }

private:
    // 权限校验方法
    bool checkPermission() {
        // 模拟权限判断逻辑,admin角色有访问权限
        return userRole == "admin";
    }
};

4. 客户端调用示例

客户端通过代理类访问文件,无需直接操作真实主题对象:

#include <iostream>
#include <string>

int main() {
    // 普通用户访问,权限不足
    FileOperator* normalUserProxy = new FileProxy("测试文档.txt", "normal");
    std::cout << normalUserProxy->readFile() << std::endl;

    // 管理员用户访问,权限通过
    FileOperator* adminProxy = new FileProxy("测试文档.txt", "admin");
    std::cout << adminProxy->readFile() << std::endl;

    delete normalUserProxy;
    delete adminProxy;
    return 0;
}

常见代理类型及适用场景

除了上述权限控制代理,C++中代理模式还有多种常见类型:

代理类型作用适用场景
虚拟代理延迟真实对象的创建,直到真正需要时才初始化加载大对象、大图片等资源时使用,避免启动时占用过多内存
远程代理为远程对象提供本地代表,隐藏远程调用的细节分布式系统、RPC调用场景,简化远程对象的使用逻辑
日志代理在访问真实对象前后记录日志需要监控对象调用情况、做操作审计的场景

实现注意事项

  • 代理类和真实主题类必须实现相同的抽象接口,否则客户端无法无差别使用两者。
  • 代理类的控制逻辑要尽量轻量,避免因为代理增加过多性能开销。
  • 如果真实主题对象的生命周期由代理管理,要注意内存释放问题,避免内存泄漏。
  • 不要在代理类中修改真实主题的核心业务逻辑,代理只负责访问控制和额外功能添加。
代理模式的核心价值是在不修改原有对象逻辑的前提下,扩展对象访问的控制能力,是解耦访问控制逻辑和业务逻辑的有效手段。

代理模式C++对象访问控制设计模式修改时间:2026-07-01 15:54:31

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。