当前位置:   article > 正文

设计模式之代理模式(C++)_c++ 代理模式

c++ 代理模式

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

一、代理模式是什么?

       代理模式是一种结构型的软件设计模式,在不改变原代码前提下,提供一个代理,以控制对原对象的访问。

       代理模式的优点:

  1. 职责清晰。真实对象专注于自身业务逻辑,不用考虑其他非本职内容,交给代理完成。
  2. 高拓展性。真实对象的改变不影响代理。
  3. 解耦。将客户端与真实对象分离,降低系统耦合度。
  4. 提高性能。虚拟代理可以减少系统资源的消耗。
  5. 高安全性和稳定性。代理能很好地控制访问,提高程序安全。

      代理模式的缺点:

  1. 增加系统复杂度。代理的职责往往较冗杂。
  2. 请求速度降低。客户端与真实对象中加入代理,一定程度上会降低整个系统流程的运行效率。

二、代理模式

2.1 结构图

       客户端即Main主函数,本文示例中代理添加了额外功能-充值,因此客户端直接调用代理。

2.2 代码示例

       场景描述:游戏往往有自己的代理商,想要玩魔兽,需要和其代理进行沟通,在进行充值后,正常游戏。

  1. //Game.h
  2. /****************************************************/
  3. #pragma once
  4. #include <iostream>
  5. using namespace std;
  6. #include <iostream>
  7. using namespace std;
  8. // 抽象游戏类
  9. class Game
  10. {
  11. public:
  12. // 游戏加载
  13. virtual void load() = 0;
  14. // 游戏退出
  15. virtual void exit() = 0;
  16. };
  17. // 真实游戏类-魔兽世界
  18. class WOW : public Game
  19. {
  20. public:
  21. // 游戏加载
  22. virtual void load() {
  23. cout << "魔兽世界加载。" << endl;
  24. }
  25. // 游戏退出
  26. virtual void exit() {
  27. cout << "魔兽世界退出。" << endl;
  28. }
  29. };
  30. // 代理类-魔兽代理
  31. class ProxyWOW : public Game
  32. {
  33. public:
  34. // 构造函数
  35. ProxyWOW() {
  36. m_wow = new WOW();
  37. }
  38. // 析构函数
  39. virtual ~ProxyWOW() {
  40. if (m_wow != nullptr) {
  41. delete m_wow;
  42. m_wow = nullptr;
  43. }
  44. }
  45. // 充值时间
  46. void recharge(int money) {
  47. m_time += money / 100;
  48. cout << "充值:" << money << endl;
  49. cout << "获得时长:" << m_time << endl;
  50. }
  51. // 游戏加载
  52. virtual void load() {
  53. cout << "代理启动。" << endl;
  54. if (m_time > 0) {
  55. m_wow->load();
  56. cout << "游戏时长1小时。" << endl;
  57. m_time -= 1;
  58. cout << "剩余时长:" << m_time << endl;
  59. flag = true;
  60. }
  61. else {
  62. cout << "剩余游戏时长不足,请充值。" << endl;
  63. flag = false;
  64. }
  65. }
  66. // 游戏退出
  67. virtual void exit() {
  68. if (flag) {
  69. m_wow->exit();
  70. flag = false;
  71. }
  72. cout << "代理关闭。" << endl;
  73. }
  74. private:
  75. bool flag = false;
  76. int m_time = 0;
  77. WOW* m_wow;
  78. };
  1. //main.cpp
  2. /****************************************************/
  3. #include <iostream>
  4. #include <string>
  5. #include "Subject.h"
  6. using namespace std;
  7. int main()
  8. {
  9. // 玩魔兽
  10. ProxyWOW* proxy = new ProxyWOW();
  11. // 加载
  12. proxy->load();
  13. // 充值
  14. proxy->recharge(1000);
  15. // 加载
  16. proxy->load();
  17. // 退出
  18. proxy->exit();
  19. // 清理内存
  20. delete proxy;
  21. proxy = nullptr;
  22. return 0;
  23. }

       程序结果如下。

       本文提供的示例是游戏方面的,玩大型网络游戏往往都要通过代理的平台,所以我模拟了一个简易的充值和游戏流程。代理在生活中随处可见,各种中介服务就是代理的一种;在网络应用中代理也很常见,如服务器代理等等。

三、总结

       我尽可能用较通俗的话语和直观的代码例程,来表述我对代理模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解代理模式。

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/523826
推荐阅读
相关标签
  

闽ICP备14008679号