代理设计模式

1. 功能和作用

代理模式(Proxy Pattern)为其他对象提供一种代理以控制对这个对象的访问。主要作用包括:

  • 访问控制:限制对真实对象的直接访问
  • 功能增强:在访问真实对象前后添加额外操作
  • 延迟加载:推迟高开销对象的创建直到真正需要时
  • 远程代理:为不同地址空间的对象提供本地代表

2. 原理

通过引入代理类实现:

  • 代理类与真实类实现相同接口
  • 客户端通过代理间接访问真实对象
  • 代理在调用真实对象前后可执行附加操作

3. 使用方式
uses
«interface»
Subject
+request() : void
RealSubject
+request() : void
Proxy
-realSubject: RealSubject
+request() : void

4. 设计原因
  • 解耦:将客户端与真实对象解耦
  • 保护:控制敏感对象的访问权限
  • 优化:避免不必要的资源消耗(如大文件加载)
  • 扩展:不修改原对象即可添加新功能

5. 适用场景
  • 远程方法调用(RPC)
  • 权限控制系统
  • 虚拟代理(如图片懒加载)
  • 缓存代理
  • 智能引用(引用计数)

6. 时序图
ClientProxyRealSubjectrequest()前置处理request()结果后置处理返回结果ClientProxyRealSubject

7. C++ 实现
#include <iostream>

// 抽象接口
class Subject {
public:
    virtual void request() = 0;
    virtual ~Subject() = default;
};

// 真实对象
class RealSubject : public Subject {
public:
    void request() override {
        std::cout << "真实对象处理请求" << std::endl;
    }
};

// 代理类
class Proxy : public Subject {
private:
    RealSubject* realSubject;

public:
    Proxy() : realSubject(nullptr) {}
    ~Proxy() { delete realSubject; }

    void request() override {
        if (!realSubject) {
            realSubject = new RealSubject();
        }
        preRequest();
        realSubject->request();
        postRequest();
    }

private:
    void preRequest() {
        std::cout << "代理前置处理" << std::endl;
    }

    void postRequest() {
        std::cout << "代理后置处理" << std::endl;
    }
};

// 客户端
int main() {
    Proxy proxy;
    proxy.request();
    return 0;
}
编译运行测试
g++ -std=c++11 -o proxy proxy.cpp && ./proxy

输出结果:

代理前置处理
真实对象处理请求
代理后置处理

8. 总结

优点:

  • 职责清晰:代理专注于访问控制,真实对象专注核心业务
  • 高扩展性:可动态添加新代理类型
  • 高灵活性:支持延迟加载和远程访问
  • 安全性:隐藏真实对象细节

缺点:

  • 性能开销:增加代理层导致调用延迟
  • 复杂度增加:需维护额外代理类
  • 可能违反开闭原则:修改真实对象需同步更新代理

改进方向:

  • 动态代理:通过反射机制动态创建代理
  • 代理链:多个代理形成处理流水线
  • 智能代理:集成AI决策访问策略

该模式在软件架构中应用广泛,特别是在分布式系统和资源管理场景,能有效平衡系统灵活性和安全性。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐