• 代理模式(Proxy Pattern)


    定义

    代理模式(Proxy Pattern)是一种结构型设计模式,其目的是为其他对象提供一个代理或占位符,以控制对这个对象的访问。代理类通常在客户端和目标对象之间起到中介的作用,用于控制对目标对象的访问,并在必要时添加额外的功能。

    示例

    1. #include
    2. // 抽象主题接口
    3. class Subject {
    4. public:
    5. virtual void request() = 0;
    6. };
    7. // 具体主题类
    8. class RealSubject : public Subject {
    9. public:
    10. void request() override {
    11. std::cout << "RealSubject: Handling request\n";
    12. }
    13. };
    14. // 代理类
    15. class Proxy : public Subject {
    16. private:
    17. RealSubject* realSubject;
    18. public:
    19. Proxy() : realSubject(nullptr) {}
    20. void request() override {
    21. // 在需要时创建真实主题对象
    22. if (!realSubject) {
    23. realSubject = new RealSubject();
    24. }
    25. // 通过代理访问真实主题对象
    26. realSubject->request();
    27. }
    28. ~Proxy() {
    29. if (realSubject) {
    30. delete realSubject;
    31. }
    32. }
    33. };
    34. // 客户端代码
    35. int main() {
    36. Proxy proxy;
    37. proxy.request(); // 客户端通过代理访问真实主题对象
    38. return 0;
    39. }

    在这个示例中:

    • Subject 是抽象主题接口,声明了真实主题类和代理类共同的操作。
    • RealSubject 是具体主题类,实现了 Subject 接口,是真正执行业务逻辑的对象。
    • Proxy 是代理类,也实现了 Subject 接口。在 request 方法中,它控制着对真实主题对象的访问,并在必要时创建真实主题对象。
    • 客户端通过调用 Proxyrequest 方法来访问真实主题对象。

    代理模式的优点在于:

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

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

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

    生活应用示例

    1. #include
    2. // 抽象主题接口
    3. class Door {
    4. public:
    5. virtual void open() = 0;
    6. virtual void close() = 0;
    7. };
    8. // 具体主题类 - 真实的门
    9. class RealDoor : public Door {
    10. public:
    11. void open() override {
    12. std::cout << "RealDoor: Opening the door\n";
    13. }
    14. void close() override {
    15. std::cout << "RealDoor: Closing the door\n";
    16. }
    17. };
    18. // 代理类 - 门禁系统
    19. class SecurityProxy : public Door {
    20. private:
    21. RealDoor* realDoor;
    22. bool isAuthorized;
    23. public:
    24. SecurityProxy() : realDoor(nullptr), isAuthorized(false) {}
    25. void open() override {
    26. // 在需要时创建真实门对象
    27. if (!realDoor) {
    28. realDoor = new RealDoor();
    29. }
    30. // 检查权限
    31. if (isAuthorized) {
    32. // 如果有权限,则通过代理打开门
    33. realDoor->open();
    34. } else {
    35. std::cout << "SecurityProxy: Access denied! You are not authorized.\n";
    36. }
    37. }
    38. void close() override {
    39. // 通过代理关闭门
    40. if (realDoor) {
    41. realDoor->close();
    42. }
    43. }
    44. // 设置授权状态
    45. void authorize(bool status) {
    46. isAuthorized = status;
    47. }
    48. ~SecurityProxy() {
    49. if (realDoor) {
    50. delete realDoor;
    51. }
    52. }
    53. };
    54. // 客户端代码
    55. int main() {
    56. SecurityProxy securityProxy;
    57. // 尝试打开门,但因为未授权,将拒绝访问
    58. securityProxy.open();
    59. // 授权
    60. securityProxy.authorize(true);
    61. // 现在可以打开门
    62. securityProxy.open();
    63. // 关闭门
    64. securityProxy.close();
    65. return 0;
    66. }

    在这个例子中:

    • Door 是抽象主题接口,声明了门的开和关的操作。
    • RealDoor 是具体主题类,实现了 Door 接口,表示真实的门。
    • SecurityProxy 是代理类,同样实现了 Door 接口。在 open 方法中,它检查是否有权限,如果有权限则通过代理打开门,否则拒绝访问。

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

  • 相关阅读:
    如何用数字人IP,焕发体育赛事活动新玩法?
    Flutter Engine 编译
    邮箱设置第三方登录授权码获取
    golang 线程 定时器 --chatGPT
    使用Go语言开发一个短链接服务:一、基本原理
    【Mysql】给查询记录增加序列号方法
    Jetpack的ViewModel与LiveData
    CKEditor5 支持 WPS 贴贴文字图片,默认贴贴进入空白空格
    C++软件异常排查从入门到精通
    Python学习笔记--类的多态
  • 原文地址:https://blog.csdn.net/weixin_40026739/article/details/136310965