C++设计模式之代理模式
非常多中国大陆的苹果粉托在香港的朋友代为购买,或者中介在中国香港购买苹果后。转卖给大陆的苹果粉。在设计模式中。也存在一种类似的模式,当client无法直接訪问某个对象或訪问某个对象存在困难时能够通过一个代理对象来间接訪问,为了保证client使用的透明性,所訪问的真实对象与代理对象须要实现同样的接口,称之为代理模式。
代理模式定义例如以下:
代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的訪问。 |
代理模式是一种对象结构型模式。在代理模式中引入了一个新的代理对象,代理对象在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)因为在client和真实主题之间添加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢
(2)实现代理模式须要额外的工作,并且有些代理模式的实现过程较为复杂,比如远程代理
3.代理模式详细应用
(1)斗地主游戏托管功能,把游戏交由系统处理。由系统决定是否出牌。
(2)网络图片查看器的开发:一般输入网址下载图片比較耗时,通过代理,当输入网址的时候,仅仅显示图标,双击图标才从网络上下载图片并显示。
(3)本例中水灾报警系统的开发。
(4)车票查询功能开发: 已经开发好了一个查询模块。如今须要加入身份验证模块,以及查询Log模块。把查询的信息记录到Log文件里。能够使用代理模式复用已经开发好的那个查询模块。
(5)生活中的代理: 酒后代驾、求律师打官司、淘宝京东等网上代购站点、房屋中介等。
C++设计模式之代理模式的更多相关文章
- C#设计模式(13)——代理模式(Proxy Pattern)
一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...
- 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)
原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...
- Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景
我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...
- 设计模式之代理模式之二(Proxy)
from://http://www.cnblogs.com/xwdreamer/archive/2012/05/23/2515306.html 设计模式之代理模式之二(Proxy) 0.前言 在前 ...
- 夜话JAVA设计模式之代理模式(Proxy)
代理模式定义:为另一个对象提供一个替身或者占位符以控制对这个对象的访问.---<Head First 设计模式> 代理模式换句话说就是给某一个对象创建一个代理对象,由这个代理对象控制对原对 ...
- GOF23设计模式之代理模式
GOF23设计模式之代理模式 核心作用:通过代理,控制对对象的访问.可以详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理(即:AOP的微观实现) AOP(Asp ...
- C#设计模式:代理模式(Proxy Pattern)
一,什么是C#设计模式? 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问 二,代码如下: using System; using System.Collectio ...
- js设计模式——1.代理模式
js设计模式——1.代理模式 以下是代码示例 /*js设计模式——代理模式*/ class ReadImg { constructor(fileName) { this.fileName = file ...
- java设计模式6——代理模式
java设计模式6--代理模式 1.代理模式介绍: 1.1.为什么要学习代理模式?因为这就是Spring Aop的底层!(SpringAop 和 SpringMvc) 1.2.代理模式的分类: 静态代 ...
- php设计模式 Proxy (代理模式)
代理,指的就是一个角色代表另一个角色采取行动,就象生活中,一个红酒厂商,是不会直接把红酒零售客户的,都是通过代理来完成他的销售业务.而客户,也不用为了喝红酒而到处找工厂,他只要找到厂商在当地的代理就行 ...
随机推荐
- 洛谷 P1177 【模板】快速排序 【快速排序/multiset排序】
题目描述 利用快速排序算法将读入的N个数从小到大排序后输出. 快速排序是信息学竞赛的必备算法之一.对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成.(C++选手请不要试图使用STL ...
- POJ1300Door Man(欧拉回路)
Door Man Time Limit: 1000MS Memory Limi ...
- vijos P1234口袋的天空(Kruskal)(最小生成树)
P1234口袋的天空 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 描述 给你云朵的个数N,再给你M个关系,表示哪些云朵 ...
- 【DFS序】【线段树】bzoj4034 [HAOI2015]T2
分开维护树的入栈序和出栈序,用两棵线段树.回答时就是用一颗的减去另一棵的. #include<cstdio> #include<algorithm> using namespa ...
- iOS 修改APP工程名字
我们在iOS开发中,难免会遇到项目做到一半要改名字的情况.如果项目名差的太大,工程名看起来总是不舒服的,就会想着为工程改个贴切的名字,那么你就为用到本文记录的内容. 如何修改工程名呢? 下面我就拿一个 ...
- spark DiskBlockManager
RDD本身presist可以是本地存储,本地存储级别的持久化实现方式如下: DiskBlockManager负责管理和维护block和磁盘存储的映射关系,通过blockId作为文件名称,然后如果是多个 ...
- JQuery提示$(...).on is not a function解决方法
版本太低了,引入较高的版本,如jquery-1.8.3.min.js
- High Speed Inter-CHIP USB 2.0 PHY
转载:http://arasan.com/products/usb/usb-2-0/hsic-phy/ High Speed Inter-CHIP USB 2.0 PHY USB is the ubi ...
- Intel haxm安装失败问题解决
在安装Intel haxm为安卓模拟器加速时,会遇到提示VT-X未开启问题,问题提示如下图 工具/原料 Intel haxm 安卓模拟器 方法/步骤 确认你的处理器是否是Intel的,如果是A ...
- Linux、CentOS系统下调整home和根分区大小
1.首先查看磁盘使用情况 [root@localhost ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 Filesystem Size Used Avail Use% Mounted ...