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

代理模式是一种程序设计最为重要的一种模式,其具体的使用非常广泛,根据它的作用,其实我们可以直接理解为中间件或者中间层,比如各类软件的中间件,软件与硬件中的中间层。

作用

为其他对象提供一种代理以控制对这个对象的访问。这样实现了业务和核心功能分离。

抽象类视图

分类

  • 虚拟代理:是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象,使其只有在真正需要时才被创建。
  • 远程代理:为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。这个不同的地址空间可以是在本机器上,也可以在另一台机器中。
  • 智能引用代理:是指当调用真实对象时,代理处理另外一些事,比如记录对此对象的调用次数等。
  • 安全代理:也叫保护代理,用来控制真实对象访问时的权限,如果有必要的话,可以给不同调用者提供不同的权限。
  • 写时拷贝代理:虚拟代理的一种,把复制推迟到只有客户的需要时才进行。
  • 缓存代理:为某一个目标的操作结果提供临时存储空间,以便其他客户的可以共享访问,有点缓存的味道。
  • 防火墙代理:保护对象,不让用户访问,安全代理的特例。
  • 同步代理:可以让几个用户同时访问同一个对象而不产生冲突。

分类实现

虚拟代理

虚拟代理的主要目的是实现延迟,这里给出[DP]一书上的例子,考虑一个可以在文档中嵌入图形对象的文档编辑器。有些图形对象的创建开销很大。但是打开文档必须很迅速,因此我们在打开文档时应避免一次性创建所有开销很大的对象。这里就可以运用代理模式,在打开文档时,并不打开图形对象,而是打开图形对象的代理以替代真实的图形。待到真正需要打开图形时,仍由代理负责打开。

// 抽象类
class Image
{
public :
  Image(std::string name) : m_name(name){ }
  virtual ~Image( ){ } 

  virtual void Show( ) = 0;      // 显示文档的函数  

protected :
  std::string m_name;       // 文档名
}; 

// 大型实体类
class BigImage : public Image
{
public :
  BigImage(std::string name) : Image(name){ }
  virtual ~BigImage( ){ } 

  void Show( )
  {
    std::cout <<"This is Big Image..." <<std::endl;
  }
}; 

// 大型图片代理器
class BigImageProxy : public Image
{
public :
  BigImageProxy(std::string name) :Image(name), m_bigImage(NULL){ }
  virtual ~BigImageProxy( )
  {
    delete m_bigImage;
  } 

  void Show( )
  {
    if(this->m_bigImage == NULL)
    {
      m_bigImage = new BigImage(this->m_name);
    }
    m_bigImage->Show( );
  } 

private :
  BigImage *m_bigImage;
}; 

// 客户端代码
int main( )
{
  Image *Image = new BigImageProxy("Image.txt");
  Image->Show( );
  delete Image; 

  return 0;
}

远程代理

远程代理多见于通讯,如网络、IPC和RPC中,一般需要提供提供了客户辅助对象和服务辅助对象,为客户辅助对象创建和服务对象相同的方法(如JAVA中的stub和skeleton),然后实现之间的具体通讯,对于client 而言stub(其实是stub和skeleton共同工作)就是其远程代理。

智能引用代理

最典型的应用就是智能指针的运用,相对于指针,智能指针就是对指针的代理;这个的具体实现可以参考auto_ptr或者share_ptr的实现。

写时拷贝代理

写时拷贝使用了虚代理和引用计数的机制,推迟拷贝动作到计数发生变化时,比较典型的运用如std::string的内存实现;具体实现可以查看string的源码

std::string str1 = "fine";
std::string str2 = str1; //执行后str2 str1 的 data 地址是一样的;
str2[0] = 'w';  //执行后str2 地址发生变化

其他代理

剩余几种代理通过对访问对象的控制来实现其具体的应用,因为牵涉到复杂的应用场景和不同的语言架构,在这里就不多讲了,可能离题远了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++设计模式之Proxy模式(代理模式)详解

    代理模式很容易理解,就是代替别人去做某一件事,打个比方,我们需要买水果,一般是去超市或者水果店买水果,很少有人去果园买水果,果园是生产水果的地方,但很少出售水果,在这里,水果店,超市就成了代理. 首先定义一个抽象类,提供所有的函数接口. 1.定义卖水果的抽象类,也就是接口,果园与超市都要继承这个类. #pragma once class CSellFruits//定义一个抽象类 { public: CSellFruits(void); virtual ~CSellFruits(void); vi

  • C++设计模式编程中proxy代理模式的使用实例

    代理模式典型的结构图为: 实际上,代理模式的想法非常简单. 代理模式的实现: 完整代码示例(code):代理模式的实现很简单,这里为了方便初学者的学习和参考,将给出完整的实现代码(所有代码采用 C++实现,并在 VC 6.0 下测试运行). 代码片断 1:Proxy.h //Proxy.h #ifndef _PROXY_H_ #define _PROXY_H_ class Subject{ public: virtual ~Subject(); virtual void Request() =

  • 浅析设计模式中的代理模式在C++编程中的运用

    由遇到的问题引出代理模式 至少在以下集中情况下可以用代理模式解决问题: 创建开销大的对象时候,比如显示一幅大的图片,我们将这个创建的过程交给代理去完成,GoF 称之为虚代理(Virtual Proxy): 为网络上的对象创建一个局部的本地代理,比如要操作一个网络上的一个对象(网络性能不好的时候,问题尤其突出),我们将这个操纵的过程交给一个代理去完成,GoF 称之为远程代理(Remote Proxy): 对对象进行控制访问的时候,比如在 Jive 论坛中不同权限的用户(如管理员.普通用户等)将获得

  • C++设计模式之代理模式

    前言 青春总是那样,逝去了才开始回味:大学生活也是在不经意间就溜走了,现在上班的时候,偶尔还会怀念大学时,大家在一起玩游戏的时光.大学喜欢玩游戏,但是可悲的校园网,速度能把人逼疯了:还好,后来搞了一个游戏代理,总算能勉勉强强的玩了两年.时至今日,敲起键盘写设计模式的时候,又想起了那些美好的时光.好了,这是一篇技术文章,而不是抒情怀旧的散文:思绪再回到这篇文章上来,游戏代理,是个什么东西,有了它就能让我们玩游戏的延迟立马下来了.今天,我并不会去总结游戏代理是如何实现的,重点是通过游戏代理这个例子来

  • Android设计模式之代理模式Proxy浅显易懂的详细说明

    一.概述 代理模式也是平时比较常用的设计模式之一,代理模式其实就是提供了一个新的对象,实现了对真实对象的操作,或成为真实对象的替身.在日常生活中也是很常见的.例如A要租房,为了省麻烦A会去找中介,中介会替代A去筛选房子,A坐享中介筛选的结果,并且交房租也是交给中介,这就是一个典型的日常生活中代理模式的应用.平时打开网页,最先开到的一般都是文字,而图片等一些大的资源都会延迟加载,这里也是使用了代理模式. 代理模式的组成 Abstract Subject:抽象主题-声明真实主题和代理主题共同的接口

  • C++设计模式之代理模式(Proxy)

    代理模式是一种程序设计最为重要的一种模式,其具体的使用非常广泛,根据它的作用,其实我们可以直接理解为中间件或者中间层,比如各类软件的中间件,软件与硬件中的中间层. 作用 为其他对象提供一种代理以控制对这个对象的访问.这样实现了业务和核心功能分离. 抽象类视图 分类 虚拟代理:是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象,使其只有在真正需要时才被创建. 远程代理:为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实.这个不同的地址空间可以是

  • .Net结构型设计模式之代理模式(Proxy)

    目录 一.动机(Motivate) 二.意图(Intent) 三.结构图(Structure) 四.模式的组成 五.代理模式的分类: 六.代理模式的具体实现 七.代理模式的实现要点: 1.代理模式的优点: 2.代理模式的缺点: 3.代理模式的使用场景: 八..NET 中代理模式的实现 九.总结 一.动机(Motivate) 在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者.或者系统结构带来很多麻烦.如何在不失去

  • Python设计模式之代理模式实例

    翻墙常用的方式就是使用代理(Proxy),其基本过程如下: 浏览器<-->代理服务器<-->服务器 如果浏览器请求不到服务器,或者服务器无法响应浏览器,我们可以设定将浏览器的请求传递给代理服务器,代理服务器将请求转发给服务器.然后,代理服务器将服务器的响应内容传递给浏览器.当然,代理服务器在得到请求或者响应内容的时候,本身也可以做些处理,例如缓存静态内容以加速,或者说提取请求内容或者响应内容做些正当或者不正当的分析.这种翻墙方式,就是设计模式中代理模式(Proxy Pattern)

  • Java设计模式之代理模式与装饰模式实例详解

    本文实例讲述了Java设计模式之代理模式与装饰模式.分享给大家供大家参考,具体如下: 之所以把这两种模式放在一起说,是因为我发现这了两种模式几乎一模一样! 从网上也搜了一些资料,发现两者还是有一些区别的.我们在学习的同时也把这种困惑搞清楚. 定义: 代理模式,为其他对象提供一种代理以控制对这个对象的访问. 装饰模式,动态地给一个对象添加一些额外的职责. 代理模式,很好理解,就是把一个对象再次封装,以后就对封装的对象访问就可以了. 因为代理对象已经取代了被代理对象. 装饰模式,给一个对象增加功能,

  • java设计模式—静态代理模式(聚合与继承方式对比)

    一.概述 1.目标:要在Tank的move()方法做时间代理及日志代理(可以设想以后还要增加很多代理处理),且代理间的顺序可活更换 2.思路: (1)聚合:代理类聚合了被代理类,且代理类及被代理类都实现了movable接口,则可实现灵活多变,具体看代码 (2)继承:继承不够灵活,随着功能需求增多,继承体系会非常臃肿.具体看代码 二.代码 1.Movable.java 2.Tank.java 3.TankTimeProxy.java 4.TankLogProxy.java 5.Tank2Time.

  • Java设计模式之代理模式原理及实现代码分享

    简介 Java编程的目标是实现现实不能完成的,优化现实能够完成的,是一种虚拟技术.生活中的方方面面都可以虚拟到代码中.代理模式所讲的就是现实生活中的这么一个概念:中介. 代理模式的定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用. 代理模式包含如下角色: ISubject:抽象主题角色,是一个接口.该接口是对象和它的代理共用的接口. RealSubject:真实主题角色,是实现抽象主题接口的类. Proxy:代理角色,内部含有对真实对象RealSubject的引用,从而可以操作真实

  • 详解ES6中的代理模式——Proxy

    什么是代理模式 代理模式(英语:Proxy Pattern)是程序设计中的一种设计模式. 所谓的代理者是指一个类别可以作为其它东西的接口.代理者可以作任何东西的接口:网络连接.内存中的大对象.文件或其它昂贵或无法复制的资源. 著名的代理模式例子为引用计数(英语:reference counting)指针对象. 当一个复杂对象的多份副本须存在时,代理模式可以结合享元模式以减少内存用量.典型作法是创建一个复杂对象及多个代理者,每个代理者会引用到原本的复杂对象.而作用在代理者的运算会转送到原本对象.一

  • Python设计模式之代理模式简单示例

    本文实例讲述了Python设计模式之代理模式.分享给大家供大家参考,具体如下: 代理模式在一般形式上是一个类函数接口.代理可以是这些事物的接口:网络连接,存储的对象,文件,或者其他资源(昂贵的或者不容易复制的). 一个众所周知的代理模式的例子就是引用计数的指针对象. 代理模式是结构设计模式的例子.这个模式的目的是要创建一个真实对象或类的代理. 代理模式有3个必要的元素: 1. 真实的对象(执行业务逻辑,被代理的对象) 2. 代理类(用户请求的一个接口,对真实目标的保护) 3. 用户(获取任务的用

  • JavaScript设计模式之代理模式实例分析

    本文实例讲述了JavaScript设计模式之代理模式.分享给大家供大家参考,具体如下: 代理模式的定义,代理是一个对象(proxy)用它来控制目标对象的访问.为此他要是先与目标对象相同的接口,但是他不同于装饰者模式,它对目标对象不进行任何修改,它的目的在于延缓"复杂"对象的初始化时间.这样可以在用到这个目标对象的时候再初始化他(对于单例来讲更是重要). 代理模式有两种分类: (1)普通代理 (2)惰性代理 具体看下面的例子 第一,普通代理模式 步骤一,接口检验文件的引用 //定义一个静

随机推荐