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水位监測抽象类实现代码例如以下:

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

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

实现代码例如以下:

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

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

//水位检測代理对象类
class ProxyWaterDetection : public IWaterDetection
{
private:
//维持一个对真实水位检測对象的引用
IWaterDetection * m_pRealWaterDetection;
public:
ProxyWaterDetection()
{
m_pRealWaterDetection = new RealWaterDetection();
} ~ProxyWaterDetection()
{
if( NULL != m_pRealWaterDetection )
{
delete m_pRealWaterDetection; m_pRealWaterDetection = NULL;
}
} //採集水位图像
void CollectWaterLevelImage()
{
cout << "採集水位图像" << endl;
} //显示处理后的水位图像
void DisplayWaterLevelImage()
{
cout << "显示处理后的水位图像" << endl;
} //对採集后的水位图像处理。以推断是否公布水灾安全警报
void ImageProcess()
{
CollectWaterLevelImage(); //调用真实水位检測对象的图像处理方法
m_pRealWaterDetection->ImageProcess(); DisplayWaterLevelImage();
}
};

測试代码实现例如以下:

#include <iostream>
#include "WaterDetection.h" using namespace std; int main()
{
//创建一个代理对象
IWaterDetection * pProxyWaterDetection = new ProxyWaterDetection(); //调用代理对象的图像处理方法
pProxyWaterDetection->ImageProcess(); //销毁操作
delete pProxyWaterDetection;
pProxyWaterDetection = NULL; return 0;
}

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

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. Windows 环境下 Redis 安装

    1.redis官方下载地址:https://redis.io/download,redis 64位下载地址:https://github.com/MicrosoftArchive/redis/rele ...

  2. java.lang.NoSuchMethodError: org.springframework.beans.factory.xml.XmlReaderContext.getResourceLoader()Lorg/springframework/core/io/ResourceLoader

    问题原因 在整合spring跟struts2是使用Maven,用到struts2-spring-plugin.jar,但是maven不但但加载了这个jar文件还有spring-beans:3.0.5. ...

  3. 【最大流】【Dinic】bzoj1711 [Usaco2007 Open]Dingin吃饭

    把牛拆点,互相连1的边. 把牛的食物向牛连边,把牛向牛的饮料连边. 把源点向牛的食物连边,把牛的饮料向汇点连边. 要把牛放在中间,否则会造成一头牛吃了自己的食物后又去喝别的牛的饮料的情况. #incl ...

  4. access日志配置

    链接地址:  https://wenku.baidu.com/view/3e20fac758f5f61fb73666cf.html org.apache.catalina.valves.AccessL ...

  5. 使用CSS实现自定义input[checkbox]样式

    思路:使用label上的for熟悉,与checkbox上的id相对应来达到点击选中效果,在使用伪元素,或者其他元素,定位至checkbox上方,替代checkbox,并且隐藏checkbox,使用CS ...

  6. pdf.js 添加自定义loading动画

    最近做了个手机端pdf预览的功能,用到pdf.js这个库,效果还不错.但是在网络差.文件大时,页面一直空白,体验不是很好. 于是加了个loading动画. <div id="loadi ...

  7. Android Studio生成APK自动追加版本号、自定义apk名称、指定签名证书文件

    你也可以查看我的其他同类文章,也会让你有一定的收货! 生成APK自动追加版本号 可自动区分debug和release,并追加版本号: 打开 build.gradle 在 android 节点中插入下面 ...

  8. js时间小总结

    1.js获取时间 var myDate = new Date(); 1 myDate.getYear(); //获取当前年份(2位) 2 myDate.getFullYear(); //获取完整的年份 ...

  9. springBoot框架的一些概念

    Spring的发展史1. Spring1.x 时代 在Spring1.x时代,都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在java类和xml ...

  10. [Linux] Ubuntu下非常给力的下载工具

    转载:http://blog.csdn.net/luojiming1990/article/details/9078447 Windows下的下载工具--迅雷,之所以下载速度快,乃是它能搜索资源.为己 ...