当前位置:   article > 正文

代理模式(Proxy Pattern)

代理模式(Proxy Pattern)

定义

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

示例

  1. #include <iostream>
  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 <iostream>
  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 方法中,它检查是否有权限,如果有权限则通过代理打开门,否则拒绝访问。

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

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

闽ICP备14008679号