为其他对象提供一种代理以控制对这个对象的访问。

    image.png

    1. #include <cstdlib>
    2. #include <iostream>
    3. #include <memory>
    4. /* 定义RealSubject和Proxy的公用接口 */
    5. class Subject {
    6. public:
    7. virtual void Request() = 0;
    8. };
    9. /* 定义Proxy所代表的真实实体 */
    10. class RealSubject : public Subject {
    11. public:
    12. RealSubject() = default;
    13. void Request() override { std::cout << "Real Request!\n"; }
    14. };
    15. /* 保存一个指针使得代理可以访问实体 */
    16. class Proxy : public Subject {
    17. public:
    18. Proxy() { realsub = std::make_unique<RealSubject>(); }
    19. void Request() override { realsub->Request(); }
    20. private:
    21. std::unique_ptr<RealSubject> realsub;
    22. };
    23. auto main()->int {
    24. std::unique_ptr<Proxy> proxy = std::make_unique<Proxy>();
    25. proxy->Request();
    26. return 0;
    27. }

    一般,代理模式用于以下场景:

    • 远程代理:为一个对象在不同的地址空间提供局部代表,这可以隐藏一个对象存在于不同地址空间的事实。
    • 虚拟代理:根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。(比如浏览网页时,里面有很多文字和图片,图片有时候是一张一张地加载出来。那些未打开的图片框就是通过虚拟代理替代了真实的图片,此时代理存储了真是图片的路径和尺寸)
    • 安全代理控制真实对象访问时的权限
    • 智能指引:当调用真实的对象时,代理处理另外一些事。可以通过代理来附加一些行为