• 设计模式12、代理模式 Proxy


    解释说明:代理模式(Proxy Pattern)为其他对象提供了一种代理,以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
    抽象主题(Subject):通过接口或抽象类声明真实主题和代理对象事项的业务方法
    真实主题(RealSubject):实现了抽象主题中额具体业务,是代理对象所代表的真实对象,是最终要引用的对象
    代理(Proxy):提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能
    优点:
        代理模式能将代理对象与真正被调用的对象分离,在一定程度上降低了系统的耦合度。
        在客户端和目标对象之间,代理起到一个中介作用,这样可以保护目标对象。在对目标对象调用之前,代理对象也可以进行其他操作。
    缺点:
        这种模式引入了另一个抽象层,这有时可能是一个问题。如果真实主题被某些客户端直接访问,并且其中一些客户端可能访问代理类,这可能会导致不同的行为。
        由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
        实现代理模式需要额外的工作,有些代理模式的实现非常复杂
    适用场景
        根据目的和实现方式的不同,代理模式可分为很多种,常见的有:
    远程代理(Remote Proxy)
        为一个位于不同地址空间的对象提供一个本地代理,对代理的方法调用会导致对远程对象的方法调用。ATM 就是一个例子,ATM 可能会持有(存在于远程服务器中的)银行信息的一个代理对象。
    虚拟代理(Virtual Proxy)
        使用虚拟代理,代理可以作为一个(资源消耗较大的)对象的代表。虚拟代理经常延迟对象的创建,直到需要为止。在创建对象之前(及创建对象过程中),虚拟代理也可以作为对象的代理;之后,代理将请求直接委托给 RealSubject。
    保护代理(Protection Proxy)
        根据访问权限,可以使用保护代理来控制对资源的访问。例如,有一个员工对象,保护代理可以允许普通员工调用对象的某些方法,管理员调用其他方法。
    缓冲代理(Cache Proxy)
        为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
    智能引用代理(Smart Reference Proxy)
        当一个对象被引用时,提供一些额外的操作(例如:将对象被调用的次数记录下来)。
    1. #pragma once
    2. #include
    3. // 电信运营商
    4. class ITelco
    5. {
    6. public:
    7. virtual ~ITelco() {}
    8. virtual void Recharge(int money) = 0; // 充值
    9. };
    10. // 中国移动
    11. class CMCC : public ITelco
    12. {
    13. public:
    14. void Recharge(int money) override {
    15. std::cout << "Recharge " << money;
    16. }
    17. };
    18. // 代理点
    19. class Proxy : public ITelco
    20. {
    21. public:
    22. Proxy() : m_pCMCC(NULL) {}
    23. ~Proxy() { delete m_pCMCC; }
    24. // 低于 50 不充
    25. void Recharge(int money) override {
    26. if (money >= 50) {
    27. if (m_pCMCC == NULL)
    28. m_pCMCC = new CMCC();
    29. m_pCMCC->Recharge(money);
    30. }
    31. else {
    32. std::cout << "Sorry, too little money" << std::endl;
    33. }
    34. }
    35. private:
    36. CMCC* m_pCMCC;
    37. };
    38. #include "subject.h"
    39. #ifndef SAFE_DELETE
    40. #define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
    41. #endif
    42. int main()
    43. {
    44. Proxy* proxy = new Proxy();
    45. proxy->Recharge(20);
    46. proxy->Recharge(100);
    47. SAFE_DELETE(proxy);
    48. getchar();
    49. return 0;
    50. }

     

  • 相关阅读:
    Python实现的人工智能冬奥会对话系统
    tensorflow简单的Demo
    分布式文件存储 - - - MinIO从入门到飞翔
    vsCode 忽略 文件上传
    面试金典--面试题 17.21. 直方图的水量(不困难的困难题)
    macOS swift下使用贝塞尔曲线制作五子棋盘(2)
    深入理解Java虚拟机:Java垃圾回收器
    RxJava(四)-过滤操作符
    Mybatis-plus-generator 自定义模板生成自定义 DTO、VO等
    Rust的数据,函数及控制流内容总结
  • 原文地址:https://blog.csdn.net/u013480226/article/details/133523983