一. 举例说明

我们有时打开一个网站时会发现有这样的现象,网站上的文字都显示出来了,但是上面的图片还没显示,要等一会才能显示。

这些未打开的图片的位置上,还是会有图片框和一些等待的信息的,这就是代理模式的应用,此时的代理存储了真实图片的路径和尺寸也用来显示一些友好的信息。

结构图如下:

代码实现:

  1. //基类
  2. class BigImage
  3. {
  4. public:
  5. BigImage(string name): m_imageName(name) {}
  6. virtual ~BigImage() {}
  7. virtual void Show() {}
  8. protected:
  9. string m_imageName;
  10. };
  11. //真实类
  12. class RealBigImage: public BigImage
  13. {
  14. public:
  15. RealBigImage(string name):BigImage(name) {}
  16. ~RealBigImage() {}
  17. void Show()
  18. {
  19. cout<<"Show big image : "<<m_imageName<<endl;
  20. }
  21. };
  22. //代理
  23. class Proxy: public BigImage
  24. {
  25. private:
  26. RealBigImage *m_bigImage;
  27. public:
  28. Proxy(string name):BigImage(name),m_bigImage(0)
  29. {}
  30. ~Proxy()
  31. {
  32. delete m_bigImage;
  33. }
  34. void Show()
  35. {
  36. if(m_bigImage == NULL)
  37. {
  38. cout<<"please wait ..."<<endl;
  39. m_bigImage = new RealBigImage(m_imageName); //代理创建真实对象
  40. }
  41. m_bigImage->Show();
  42. }
  43. };
  44. int main()
  45. {
  46. BigImage *image = new Proxy("SomeBigPic.jpg"); //使用代理
  47. image->Show(); //代理的操作
  48. delete image;
  49. return 0;
  50. }

说明:

BigImage:虚基类,定义了 RealBigImage 和 Proxy 的共用接口,这样就在任何使用 RealBigImage 的地方都可以使用 Proxy。

RealBigImage:定义Proxy所代表的真实实体。

Proxy:通过代理访问实体。

二. 代理模式

定义:为其他对象提供一种代理以控制对这个对象的访问

代理模式分为四种情况:(1)远程代理,(2)虚代理,(3)保护代理,(4)智能引用。

上文介绍的是虚代理,虚代理是当创建开销很大时,通过代理来存放需要很长时间的真实对象。

代理模式的要点:

1. 代理模式与真实对象有同样的接口,这样保证在任何使用 RealSubject 的地方都可以使用 Proxy。

2. Proxy 保存一个真实象的引用,这样可以访问 RealSubject 对象。

设计模式C++描述----13.代理(Proxy)模式的更多相关文章

  1. Head First 设计模式 —— 13. 代理 (Proxy) 模式

    思考题 如何设计一个支持远程方法调用的系统?你要怎样才能让开发人员不用写太多代码?让远程调用看起来像本地调用一样,毫无瑕疵? P435 已经接触过 RPC 了,所以就很容易知道具体流程:客户端调用目标 ...

  2. 设计模式的征途—13.代理(Proxy)模式

    所谓代购,简单说来就是找人帮忙购买所需要的商品.代购分为两种类型,一种是因为在当地买不到某件商品,又或者是因为当地这件商品的价格比其他地区的贵,因此托人在其他地区甚至国外购买该商品,然后通过快递发货或 ...

  3. 《图解设计模式》读书笔记9-2 Proxy模式

    目录 Proxy模式 示例程序 程序描述 类图 程序 角色和类图 角色 模式类图 思路拓展 提升速度 代理与委托 Http代理 与其他模式的关联 Decorator模式 Proxy模式 Proxy是代 ...

  4. 代理(Proxy)模式简介

    Proxy 模式简介 代理模式的两个应用: 打开文档时加载大图片 例如:如果有个对象是一张很大的图片,而这张图片需要花费很长时间才能显示出来,那么当这个图片包含在文档中的后面时,使用编辑器或浏览器打开 ...

  5. 设计模式之(三)Proxy模式

    今天学习Proxy模式.代理模式是在对已有对象操作困难或者不太方便时,选择用代理的方式对对象进行访问.Proxy实现的方法必须和被代理对象一致. 举一个简单的例子, 有一个Math类实现了IMath接 ...

  6. 设计模式(二十一)Proxy模式

    在面向对象编程中,“本人”和“代理人”都是对象.如果“本人”对象太忙了,有些工作无法自己亲自完成,就将其交给“代理人”对象负责. 示例程序的类图. 示例程序的时序图.从这个时序图可以看出,直到调用pr ...

  7. ⑦ 设计模式的艺术-13.代理(Proxy)模式

    为什么需要代理模式 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口. 开闭原则,增加 ...

  8. 设计模式--代理(Proxy)模式

    在公司,经常性听到采购部的人说采购某样东材料,采购不了,需要通过代理商才可以.以前Insus.NET也做有一个练习<找人办事,代理设计模式(Proxy)>http://www.cnblog ...

  9. 十、设计模式之代理(Proxy)模式

    什么是代理模式 代理模式是对象的结构模式,为其他对象提供一种对象以控制对这个对象的访问. 代理模式的结构图如下:(源自大话设计模式)   Subject:定义了RealSubject和Proxy的公共 ...

随机推荐

  1. Angular7 HttpClient处理多个请求

    1. MergeMap - 串联请求 后一个请求需要前一个请求的返回结果时,需要使用串联请求. 可以使用MergeMap实现, 优势是减少嵌套,优化代码: 代码如下: import {HttpClie ...

  2. 体验StartOS

    旧电脑,原来使用的是win xp.随着win及其支持打软件打“成长”,电脑运行越来越慢了.一个操作需要很长的时间等待,终于,失去了耐心,换了新的电脑. 旧电脑弃置多年,留之无用,弃之可惜.偶发奇想,换 ...

  3. linux 更改文件所属用户及用户组

      在Linux中,创建一个文件时,该文件的拥有者都是创建该文件的用户.该文件用户可以修改该文件的拥有者及用户组,当然root用户可以修改任何文件的拥有者及用户组.在Linux中,对于文件的权限(rw ...

  4. Zookeeper 学习笔记之 节点个数

    zookeeper的节点配置的个数推荐是奇数个这是为什么呢? 选举机制 两种情况无法选出leader: 整个集群只有2台服务器(注意不是只剩2台,而是集群的总节点数为2) 整个集群超过半数机器挂掉. ...

  5. 【MySQL】java.sql.SQLException: The server time zone value

    错误:Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: The se ...

  6. Linux简单检查服务运行脚本

    脚本内容如下: 此脚本含义:检查服务是否运行,在运行则记录日志,不在运行则记录日志并将服务启动 #!/bin/bash svrnm="tomcat" //设置服务名称time=`d ...

  7. CSS ellipsis 与 padding 结合时的问题

    CSS 实现的文本截断 考察如下代码实现文本超出自动截断的样式代码: .truncate-text-4 { overflow: hidden; text-overflow: ellipsis; dis ...

  8. Kafka技术原理知识点总结

    1.Kafka是由Linkedin公司开发的,使用Scala语言编写的,分布式,多副本,多分区的,发布订阅模式的消息系统,他通常用于日志系统的搭建,2.Kafka和Zookeeper:Kafka通过Z ...

  9. 用深度学习做命名实体识别(七)-CRF介绍

    还记得之前介绍过的命名实体识别系列文章吗,可以从句子中提取出人名.地址.公司等实体字段,当时只是简单提到了BERT+CRF模型,BERT已经在上一篇文章中介绍过了,本文将对CRF做一个基本的介绍.本文 ...

  10. SpringBoot自动注入分析

    我们经常会被问到这么一个问题:SpringBoot相对于spring有哪些优势呢?其中有一条答案就是SpringBoot自动注入.那么自动注入的原理是什么呢?我们进行如下分析. 1:首先我们分析项目的 ...