IPhone 6已经在中国香港开售了,圆了在专卖店等候一个多月苹果粉丝的苹果梦。然而对中国大陆而言。须要到9月17日苹果才在大陆开售。这对中国大陆的粉丝而言,不亚于一种煎熬,因此而滋生一种代购方式。

非常多中国大陆的苹果粉托在香港的朋友代为购买,或者中介在中国香港购买苹果后。转卖给大陆的苹果粉。在设计模式中。也存在一种类似的模式,当client无法直接訪问某个对象或訪问某个对象存在困难时能够通过一个代理对象来间接訪问,为了保证client使用的透明性,所訪问的真实对象与代理对象须要实现同样的接口,称之为代理模式。
    


1、代理模式概述

代理模式定义例如以下:

代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的訪问。

代理模式是一种对象结构型模式。在代理模式中引入了一个新的代理对象,代理对象在client对象和目标对象之间起到中介的作用,它去掉客户不能看到的内容和服务或者增添客户须要的额外的新服务。

代理模式的结构比較简单。其核心是代理类,为了让client可以一致性地对待真实对象和代理对象,在代理模式中引入了抽象层。

代理模式包括例如以下三个角色:

    (1) Subject(抽象主题角色):它声明了真实主题和代理主题的共同接口,这样一来在不论什么使用真实主题的地方都能够使用代理主题。client通常须要针对抽象主题角色进行编程。

    (2) Proxy(代理主题角色):它包括了对真实主题的引用。从而能够在不论什么时候操作真实主题对象;在代理主题角色中提供一个与真实主题角色同样的接口,以便在不论什么时候都能够替代真实主题。代理主题角色还能够控制对真实主题的使用,负责在须要的时候创建和删除真实主题对象,并对真实主题对象的使用加以约束。

通常,在代理主题角色中。client在调用所引用的真实主题操作之前或之后还须要运行其它操作。而不不过单纯调用真实主题对象中的操作。

    (3) RealSubject(真实主题角色):它定义了代理角色所代表的真实对象。在真实主题角色中实现了真实的业务操作,client能够通过代理主题角色间接调用真实主题角色中定义的操作。

2、水位报警系统的设计与实现

       某软件公司须要设计一个水位报警系统,需求例如以下: 可以实时採集水位的变化,把採集到的水位变化以图片的方式传回;图像处理模块将对採集回来的图片进行处理。用以确定是否公布水灾报警; 可以将图像处理模块处理后的图像显示出来。如今已经开发好了图像处理模块,请用代理模式设计该系统。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQXBlTGlmZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

IWaterDetection充当抽象主题角色。RealWaterDetection充当真实主题角色,ProxyWaterDetection充当代理主题角色。IWaterDetection水位监測抽象类提供一个虚方法,对採集到的水位图像进行处理。详细处理过程由真实水位监測对象RealWaterDetection进行处理。IWaterDetection水位监測抽象类实现代码例如以下:

  1. //水位检測抽象类
  2. class IWaterDetection
  3. {
  4. public:
  5. //对採集后的水位图像处理,以推断是否公布水灾安全警报
  6. virtual void ImageProcess() = 0;
  7. };

RealWaterDetection真实水位监測对象将对採集后的水位图像进行处理,实现了真实的业务逻辑。ImageProcess是图像处理的业务方法。

实现代码例如以下:

  1. //水位检測真实对象类
  2. class RealWaterDetection : public IWaterDetection
  3. {
  4. public:
  5.  
  6. //对採集后的水位图像处理,以推断是否公布水灾安全警报
  7. void ImageProcess()
  8. {
  9. cout << "------对採集后的水位图像信息进行处理,以推断是否公布水灾安全警报" << endl;
  10. }
  11. };

ProxyWaterDetection水位检測代理对象,维持了一个真实水位监測对象的引用。在对图像进行处理时。先採集水位图像。然后调用真实水位监測对象的图像处理方法。最后将处理后的图像显示出来。实现代码例如以下:

  1. //水位检測代理对象类
  2. class ProxyWaterDetection : public IWaterDetection
  3. {
  4. private:
  5. //维持一个对真实水位检測对象的引用
  6. IWaterDetection * m_pRealWaterDetection;
  7. public:
  8. ProxyWaterDetection()
  9. {
  10. m_pRealWaterDetection = new RealWaterDetection();
  11. }
  12.  
  13. ~ProxyWaterDetection()
  14. {
  15. if( NULL != m_pRealWaterDetection )
  16. {
  17. delete m_pRealWaterDetection;
  18.  
  19. m_pRealWaterDetection = NULL;
  20. }
  21. }
  22.  
  23. //採集水位图像
  24. void CollectWaterLevelImage()
  25. {
  26. cout << "採集水位图像" << endl;
  27. }
  28.  
  29. //显示处理后的水位图像
  30. void DisplayWaterLevelImage()
  31. {
  32. cout << "显示处理后的水位图像" << endl;
  33. }
  34.  
  35. //对採集后的水位图像处理。以推断是否公布水灾安全警报
  36. void ImageProcess()
  37. {
  38. CollectWaterLevelImage();
  39.  
  40. //调用真实水位检測对象的图像处理方法
  41. m_pRealWaterDetection->ImageProcess();
  42.  
  43. DisplayWaterLevelImage();
  44. }
  45. };

測试代码实现例如以下:

  1. #include <iostream>
  2. #include "WaterDetection.h"
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8. //创建一个代理对象
  9. IWaterDetection * pProxyWaterDetection = new ProxyWaterDetection();
  10.  
  11. //调用代理对象的图像处理方法
  12. pProxyWaterDetection->ImageProcess();
  13.  
  14. //销毁操作
  15. delete pProxyWaterDetection;
  16. pProxyWaterDetection = NULL;
  17.  
  18. return 0;
  19. }

编译并执行结果例如以下:

3、代理模式总结

抽象主题声明了真实主题和代理主题的共同接口,这样一来在不论什么使用真实主题的地方都能够使用代理主题,client通常须要针对抽象主题角色进行编程。真实主题角色中实现了真实的业务操作,而代理主题维持了一个真实主题的引用。当client调用代理主题的方法时,将调用真实主题的业务方法。

代理主题相当于一个中介,实际主要操作还是得托付给真实主题进行处理。

1.主要长处
    (1)当假设须要在訪问真实主题时添加新的訪问控制机制和新功能。仅仅需添加一个新的代理类,在client代码中使用新增代理类就可以,源码无须改动。符合开闭原则。
    (2)client能够一致的对待真实主题对象和代理主题对象,符合针对接口编程原则,减少系统的耦合度。
    (3)client不须要直接訪问真实主题。而由代理对象间接处理,符合"迪迷特法则"。

    (4)代理对象维持一个真实对象的引用。它们是一种组合关系。符合多用组合少用继承原则。
2.主要缺点

代理模式的主要缺点例如以下:

(1)因为在client和真实主题之间添加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢

(2)实现代理模式须要额外的工作,并且有些代理模式的实现过程较为复杂,比如远程代理

3.代理模式详细应用

(1)斗地主游戏托管功能,把游戏交由系统处理。由系统决定是否出牌。

(2)网络图片查看器的开发:一般输入网址下载图片比較耗时,通过代理,当输入网址的时候,仅仅显示图标,双击图标才从网络上下载图片并显示。

(3)本例中水灾报警系统的开发。

(4)车票查询功能开发: 已经开发好了一个查询模块。如今须要加入身份验证模块,以及查询Log模块。把查询的信息记录到Log文件里。能够使用代理模式复用已经开发好的那个查询模块。

(5)生活中的代理: 酒后代驾、求律师打官司、淘宝京东等网上代购站点、房屋中介等。

C++设计模式之代理模式的更多相关文章

  1. C#设计模式(13)——代理模式(Proxy Pattern)

    一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...

  2. 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)

    原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...

  3. Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景

    我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...

  4. 设计模式之代理模式之二(Proxy)

    from://http://www.cnblogs.com/xwdreamer/archive/2012/05/23/2515306.html 设计模式之代理模式之二(Proxy)   0.前言 在前 ...

  5. 夜话JAVA设计模式之代理模式(Proxy)

    代理模式定义:为另一个对象提供一个替身或者占位符以控制对这个对象的访问.---<Head First 设计模式> 代理模式换句话说就是给某一个对象创建一个代理对象,由这个代理对象控制对原对 ...

  6. GOF23设计模式之代理模式

    GOF23设计模式之代理模式 核心作用:通过代理,控制对对象的访问.可以详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理(即:AOP的微观实现) AOP(Asp ...

  7. C#设计模式:代理模式(Proxy Pattern)

    一,什么是C#设计模式? 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问 二,代码如下: using System; using System.Collectio ...

  8. js设计模式——1.代理模式

    js设计模式——1.代理模式 以下是代码示例 /*js设计模式——代理模式*/ class ReadImg { constructor(fileName) { this.fileName = file ...

  9. java设计模式6——代理模式

    java设计模式6--代理模式 1.代理模式介绍: 1.1.为什么要学习代理模式?因为这就是Spring Aop的底层!(SpringAop 和 SpringMvc) 1.2.代理模式的分类: 静态代 ...

  10. php设计模式 Proxy (代理模式)

    代理,指的就是一个角色代表另一个角色采取行动,就象生活中,一个红酒厂商,是不会直接把红酒零售客户的,都是通过代理来完成他的销售业务.而客户,也不用为了喝红酒而到处找工厂,他只要找到厂商在当地的代理就行 ...

随机推荐

  1. 洛谷 P3397 地毯 【二维差分标记】

    题目背景 此题约为NOIP提高组Day2T1难度. 题目描述 在n*n的格子上有m个地毯. 给出这些地毯的信息,问每个点被多少个地毯覆盖. 输入输出格式 输入格式: 第一行,两个正整数n.m.意义如题 ...

  2. 数据排序 第三讲( 各种排序方法 结合noi题库1.10)

    说了那么多种排序方法了,下面就来先做几个题吧 06:整数奇偶排序 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 给定10个整数的序列,要求对其重新排序.排序 ...

  3. Ubuntu开机启动的方式

    方法一:--------------------------------------------------1. 在/etc/init.d/下放置启动脚本,比如postgresqlroot@ubunt ...

  4. [Atcoder Regular Contest 063] Tutorial

    Link: ARC063 传送门 C: 将每种颜色的连续出现称为一段,寻找总段数即可 #include <bits/stdc++.h> using namespace std; ,len; ...

  5. 【记忆化搜索】bzoj1048 [HAOI2007]分割矩阵

    标准差=√(Σ(xi-xba)2/n)=Σ(xi)2+xba*n-2*xba*sum.只需最小化每个分割出来的矩阵的平方和即可. #include<cstdio> #include< ...

  6. 【最大权闭合子图/最小割】BZOJ3438-小M的作物【待填】

    [题目大意] 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子有1个(就是可以种一棵作物)(用1...n编号),现在,第i种作物种植在A中种植 ...

  7. Problem I: 打印金字塔

    #include<stdio.h> int main() { int n,i,j,k; scanf("%d",&n); ;i<=n;i++) { ;j&l ...

  8. nodejs全局变量设置设置

    编辑 ~/.npmrc 加入下面内容 prefix = D:\tool\nodejs\node_global cache = D:\tool\nodejs\node_cache registry = ...

  9. 在PC机上,如何用Chrome浏览器模拟查看和调试手机的HTML5页面?

    如题,如何用PC机上的Chrome浏览器模拟查看和调试手机HTML5页面? 参考操作步骤如下: 第一步.用Chrome打开要调试的页面: 第二步.按F12,打开“开发者工具”,点击其右上角的“Dock ...

  10. windbg学习—-.ecxr

      .ecxr 命令定位当前异常的上下文信息,并显示指定记录中的重要寄存器 0:000> .ecxr eax=10000000 ebx=7ffd9000 ecx=77386500 edx=002 ...