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 (代理模式)
代理,指的就是一个角色代表另一个角色采取行动,就象生活中,一个红酒厂商,是不会直接把红酒零售客户的,都是通过代理来完成他的销售业务.而客户,也不用为了喝红酒而到处找工厂,他只要找到厂商在当地的代理就行 ...
随机推荐
- 洛谷 P1583 魔法照片【二级结构体排序】
题目描述 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人.佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i].然后将初始权值从大到小进行排序 ...
- Codeforces Round 252 (Div. 2)
layout: post title: Codeforces Round 252 (Div. 2) author: "luowentaoaa" catalog: true tags ...
- mysql 列转行,合并字段的方法
数据表(表名:xsk) +----+------+-----------+-------+ | id | name| course | score | +----+------+----------- ...
- Miller-Rabin与Pollard-Rho备忘
Miller-Rabin素性测试算法: 根据费马小定理当p为素数时成立,所以如果存在一个a使x不满足此定理,则x必然不为素数. 但这是充分条件而不是必要条件,所以对于每个a,可能存在满足定理的x,这时 ...
- POJ 3494 Largest Submatrix of All 1’s(最大子图形)
[题目链接] http://poj.org/problem?id=3494 [题目大意] 在01矩阵中求最大全1子矩形 [题解] 在处理每个点的时候,继承上一个点等高度下的左右最大扩展, 计算在该层的 ...
- POJ 2932 Coneology(扫描线)
[题目链接] http://poj.org/problem?id=2932 [题目大意] 给出N个两两没有公共点的圆,求所有不包含于其它圆内部的圆 [题解] 我们计算出所有点在圆心所有y位置的x值, ...
- 1.10(java学习笔记)super关键字
supe主要是调用父类中被重写的方法及属性. 用下列代码那说明: package cn.hcf.TestSuper; public class TestSuper { public static vo ...
- 数据结构之B-树,你每天都在用的,源码发布!
五一前就筹划着写下这篇文章,但是迫于自己从来没有实现过B-树(如果大家感兴趣,我可以考虑写一篇B+树的文章),手中没有源代码,另外自己以前对B-树也是一知半解状态中,担心误人子弟,在4月30日终于把代 ...
- 上传--下载HDFS文件并指定文件物理块的大小
使用hdfs的api接口分别实现从本地上传文件到集群和从集群下载文件到本地. 1)上传文件主要是使用FileSystem类的copyFromLocalFile()方法来实现,另外我们上传文件时可以指定 ...
- RUEI 13.1.1版本在OEL 5.7上的安装
准备工作 ntp的工作和同步 /sbin/chkconfig --list | grep ntpd ntpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off /sb ...