• 代理模式 结构型模式之四


    1.概念

            代理模式是一种常见的设计模式,它允许你在不直接访问对象的情况下,通过一个代理对象来控制对该对象的访问。这个代理对象可以作为客户端和实际对象之间的中介,从而实现一些特定的控制功能,比如限制访问、记录访问日志等。

            怎么理解呢,我们一般来说存在一个实际的对象,这个对象包含了丰富的业务方法,我们当然可以暴露出来给所有人使用。但是有时候我们并不希望这些方法没没有限制的使用,比如某个方法是重启服务器。如果这个方法不加约束的暴露给所有人,那将会是一场灾难。因此这个时候我们需要给这个对象一层保护壳,也就是代理,其它人都需要经过代理来访问它。再举一个例子。好比一个君主,如果随便让别人访问它,万一里面藏着刺客,这个君主随时面临生命危险。所以大家想要给君主传达信息,一般都是通过代理人(大臣)来帮忙传达,这就是代理模式的其中一种应用场景,安全代理。

    2.组成结构

    1. 抽象主题(Subject):定义了代理和实际对象之间的共同接口。这个接口通常包含了代理对象需要实现的方法。
    2. 实际主题(Real Subject):定义了代理对象所代表的实际对象。
    3. 代理(Proxy):代理对象实现了抽象主题中的接口,并保存了对实际主题的引用。代理对象可以控制对实际对象的访问,比如限制访问或记录访问日志等。

    3.示例代码

    1. #pragma once
    2. #include
    3. #include
    4. using namespace std;
    5. //抽象类
    6. class VideoSite
    7. {
    8. public:
    9. virtual void freeMovie() = 0; //免费电影
    10. virtual void vipMovie() = 0; //vip电影
    11. virtual void ticketMovie() = 0;//用券电影
    12. };
    13. //具体实现类
    14. class FixBugVideoSite : public VideoSite
    15. {
    16. public:
    17. virtual void freeMovie() //免费电影
    18. {
    19. cout << "观看免费电影" << endl;
    20. }
    21. virtual void vipMovie() //vip电影
    22. {
    23. cout << "观看vip电影" << endl;
    24. }
    25. virtual void ticketMovie() //用券电影
    26. {
    27. cout << "用券观看电影" << endl;
    28. }
    29. };
    30. //普通用户代理类
    31. class FreeVideSiteProxy : public VideoSite
    32. {
    33. public:
    34. FreeVideSiteProxy()
    35. {
    36. pVideo = new FixBugVideoSite();
    37. }
    38. ~FreeVideSiteProxy()
    39. {
    40. delete pVideo;
    41. }
    42. virtual void freeMovie() //免费电影
    43. {
    44. pVideo->freeMovie(); //通过代理对象的freeMovie,来访问真正委托类对象的freeMovie方法
    45. }
    46. virtual void vipMovie() //vip电影
    47. {
    48. cout << "不好意思,您不是VIP,请先充值。" << endl;
    49. }
    50. virtual void ticketMovie()//用券电影
    51. {
    52. cout << "不好意思,您没有券,请先购买。" << endl;
    53. }
    54. private:
    55. FixBugVideoSite* pVideo;
    56. };
    57. //VIP用户代理类
    58. class vipVideSiteProxy : public VideoSite
    59. {
    60. public:
    61. vipVideSiteProxy()
    62. {
    63. pVideo = new FixBugVideoSite();
    64. }
    65. ~vipVideSiteProxy()
    66. {
    67. delete pVideo;
    68. }
    69. virtual void freeMovie() //免费电影
    70. {
    71. pVideo->freeMovie(); //通过代理对象的freeMovie,来访问真正委托类对象的freeMovie方法
    72. }
    73. virtual void vipMovie() //vip电影
    74. {
    75. pVideo->vipMovie();
    76. }
    77. virtual void ticketMovie()//用券电影
    78. {
    79. cout << "不好意思,您没有券,请先购买。" << endl;
    80. }
    81. private:
    82. VideoSite* pVideo;
    83. };
    84. void main()
    85. {
    86. unique_ptr p1(new FreeVideSiteProxy());
    87. unique_ptr p2(new vipVideSiteProxy());
    88. p1->freeMovie();
    89. p1->vipMovie();
    90. p1->ticketMovie();
    91. cout << "--------------------------" << endl;
    92. p2->freeMovie();
    93. p2->vipMovie();
    94. p2->ticketMovie();
    95. }

    在上面的例子种,代理就是的作用就是做权限的隔绝。

    4.应用场景

    1. 访问控制:代理模式可以用来控制对实际对象的访问权限。比如,只有特定用户或角色才能访问某些敏感数据。
    2. 远程访问:代理模式可以用来处理远程对象的访问。比如,通过代理对象来访问远程Web服务。
    3. 延迟加载:代理模式可以用来实现延迟加载。比如,通过代理对象来加载某些资源或数据,以避免在程序启动时就加载所有数据。
    4. 缓存:代理模式可以用来实现缓存。比如,代理对象可以缓存一些频繁访问的数据或结果,以提高程序的性能。
    5. 远程代理:当需要在不同的进程或机器之间进行通信时,可以使用远程代理来封装和管理通信的过程和数据。
    6. 虚拟代理:当需要延迟加载或预加载大量数据时,可以使用虚拟代理来提高程序的性能和效率。
    7. 安全代理:当需要限制外部对对象的访问权限时,可以使用安全代理来实现访问控制和管理。
    8. 缓存代理:当需要对经常使用的数据进行缓存时,可以使用缓存代理来管理和优化数据的访问效率。
    9. 智能指针代理:当需要对对象进行内存管理和安全释放时,可以使用智能指针代理来管理对象的生命周期。

    5.优缺点

    优点:

    1. 代理模式可以提供额外的访问控制,从而保证安全性。代理类可以拦截外部请求,并控制对实际对象的访问权限。
    2. 代理模式可以实现对实际对象的延迟加载。例如,在使用代理模式实现图片加载时,可以在实际需要加载图片时才创建实际对象,从而提高程序的性能和效率。
    3. 代理模式可以实现对实际对象的访问管理和优化。例如,在使用代理模式实现数据库连接时,可以通过代理类来管理连接池和连接的使用,从而优化数据库的访问效率。
    4. 代理模式可以实现对实际对象的增强和扩展。例如,在使用代理模式实现日志记录时,可以通过代理类来增强实际对象的功能,从而记录相关的日志信息。

    缺点:

    1. 代理模式会增加程序的复杂度和开销。在代理模式中,需要创建额外的代理类,并对代理类和实际对象之间的接口和交互方式进行设计和实现。
    2. 代理模式可能会降低程序的性能和效率。在代理模式中,需要对代理类和实际对象之间的通信进行额外的开销和处理,从而可能会影响程序的性能和效率。

    6.引用

    深入剖析C++代理模式:优缺点和应用场景一览无余 - 知乎 (zhihu.com)

    C++之代理模式_c++代理模式_Flying clouds的博客-CSDN博客

     

  • 相关阅读:
    【Java】快速入门
    赛轮集团SAILUN方程式赛车轮胎震撼登场,开启新篇章
    值得学习的演示文稿制作范例
    新唐NUC980使用记录:在用户应用中使用GPIO
    滨海新区副区长张桂华一行调研考察GBASE南大通用
    基于springboot+vue的贫困地区留守儿童资助关怀网站 elementui
    Win11校园网无法连接怎么办?Win11连接不到校园网的解决方法
    ES6 入门教程 13 Symbol 13.4 实例:消除魔术字符串 & 13.5 属性名的遍历
    vue之路由、无痕浏览加Nodejs环境安装及elementui介绍
    面向对象设计模式——工厂方法(Method Factory))
  • 原文地址:https://blog.csdn.net/Physics_ITBoy/article/details/133383064