代理对象我所理解的设计模式(C++实现)——代理模式(Proxy Pattern)

文章结束给大家来个程序员笑话:[M]

    

概述

    作为C++工程师,免不了要管理内存,内存管理也是C++中的难点,而智能指针采用引用计数的方法很方便的帮我们管理了内存的应用,极大方便了我们的任务效率。而智能指针的这类用法其实就是代理模式的一种,他帮我们控制了该对象的内存应用。

    代理模式就是为其他对象提供一种代理来控制对这个对象的拜访。

    

    

种类和用途

    Proxy模式根据种类不同,效果也不尽雷同:

    1、近程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可所以在本机器中,也可是在另一台机器中。近程代理又叫做大使(Ambassador)。好处是系统可以将网络的细节隐藏起来,使得客户端不必斟酌网络的存在。客户完全可以认为被代理的对象是局域的而不是近程的,而代理对象承当了大部份的网络通讯任务。由于客户可能没有意识到会启动一个耗费时间的近程调用,因此客户没有须要的思想准备。

    2、虚拟(Virtual)代理:根据需要创立一个资源消耗较大的对象,使得此对象只在需要时才会被真正创立。应用虚拟代理模式的好处就是代理对象可以在须要的时候才将被代理的对象加载;代理可以对加载的进程加以须要的优化。当一个模块的加载非常耗费资源的情况下,虚拟代理的好处就非常显著。

    3、Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。

    4、保护(Protector Access)代理:控制对一个对象的拜访,如果需要,可以给不同的用户提供不同级别的应用权限。保护代理的好处是它可以在运行时间对用户的有关权限进行检查,然后在核实后决定将调用传递给被代理的对象。

    5、Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。

    6、防火墙(Firewall)代理:保护目标,不让恶意用户亲近。

    7、同步化(Synchronization)代理:使几个用户能够同时应用一个对象而没有冲突。

    8、智能引用(SmartReference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。

    在所有种类的代理模式中,虚拟(Virtual)代理、近程(Remote)代理、智能引用代理(SmartReference Proxy)和保护(Protector Access)代理是最为常见的代理模式。

 

    

类图和实例

    

代理和对象

    

代理模式所涉及的角色有:

抽象主题角色(Subject):声明白实在主题和代理主题的共同接口,这样一来在任何应用实在主题的地方都可以应用代理主题。

代理主题(Proxy)角色:代理主题角色内部含有对真是主题的引用,从而可以在任何时候操作实在主题对象;代理主题角色提供一个与实在主题角色雷同的接口,以便可以在任何时候都可以替换实在主体;控制实在主题的应用,担任在需要的时候创立实在主题对象(和删除实在主题对象);代理角色通常在将客户端调用传递给实在的主题之前或以后,都要执行某个操作,而不是单纯的将调用传递给实在主题对象。

实在主题角色(RealSubject)角色:定义了代理角色所代表的实在对象。


    这里给出一个C++中智能指针的例子,自己代码从新实现了下:

每日一道理
天又快黑了,这座忙碌的城市又将入睡,让这劳累的“身躯”暂别白日的辛勤,让它入睡,陪伴着城市中的人们进入梦乡。当空的弯月正深情地注视着这座城市与城市中的人们,看着家家户户的灯渐渐熄灭,它在床头悄悄奏响“明月曲”……
// TestProxy.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <assert.h>#define KSAFE_DELETE(p) \if (p)			 \{				 \delete p;	 \p = NULL;	 \}class KRefCount
{
public:KRefCount():m_nCount(0){}public:void AddRef(){m_nCount++;}int Release(){return --m_nCount;}void Reset(){m_nCount=0;}private:int m_nCount;
};template <typename T>
class KSmartPtr
{
public:KSmartPtr(void): m_pData(NULL){m_pReference = new KRefCount();m_pReference->AddRef();}KSmartPtr(T* pValue): m_pData(pValue){m_pReference = new KRefCount();m_pReference->AddRef();}KSmartPtr(const KSmartPtr<T>& sp): m_pData(sp.m_pData), m_pReference(sp.m_pReference){m_pReference->AddRef();}~KSmartPtr(void){if (m_pReference && m_pReference->Release() == 0){KSAFE_DELETE(m_pData);KSAFE_DELETE(m_pReference);}}inline T& operator*(){return *m_pData;}inline T* operator->(){return m_pData;}KSmartPtr<T>& operator=(const KSmartPtr<T>& sp){if (this != &sp){if (m_pReference && m_pReference->Release() == 0){KSAFE_DELETE(m_pData);KSAFE_DELETE(m_pReference);}m_pData = sp.m_pData;m_pReference = sp.m_pReference;m_pReference->AddRef();}return *this;}KSmartPtr<T>& operator=(T* pValue){if (m_pReference && m_pReference->Release() == 0){KSAFE_DELETE(m_pData);KSAFE_DELETE(m_pReference);}m_pData = pValue;m_pReference = new KRefCount;m_pReference->AddRef();return *this;}T* Get(){T* ptr = NULL;        ptr = m_pData;return ptr;}void Attach(T* pObject){if (m_pReference->Release() == 0){KSAFE_DELETE(m_pData);KSAFE_DELETE(m_pReference);}m_pData = pObject;m_pReference = new KRefCount;m_pReference->AddRef();}T* Detach(){T* ptr = NULL;if (m_pData){           ptr = m_pData;m_pData = NULL;m_pReference->Reset();}return ptr;}private:KRefCount* m_pReference;T* m_pData;
};

    

与其他模式的区分

    1)适配器模式Adapter

    适配器Adapter为它所适配的对象提供了一个不同的接口。相反,代理提供了与它的实体雷同的接口。然而,用于拜访保护的代理可能会拒绝执行实领会执行的操作,因此,它的接口实际上可能只是实体接口的一个子集。

    2) 装饰器模式Decorator

    尽管Decorator的实现部分与代理相似,但Decorator的目的不一样。Decorator为对象添加一个或多个功能,而代理则控制对对象的拜访。 

    

总结

    在软件系统中,加一个中间层是我们常用的解决方法,这方面Proxy模式给了我们很好的实现。

    

    LCL_data原创于CSDN.NET【http://blog.csdn.net/lcl_data/article/details/8989420】

文章结束给大家分享下程序员的一些笑话语录: 腾讯的动作好快,2010年3月5日19时28分58秒,QQ同时在线人数1亿!刚刚看到编辑发布的文章,相差才2分钟,然后连专题页面都做出来了,他们早就预料到了吧?(其实,每人赠送10Q币,轻轻松松上两亿!)

--------------------------------- 原创文章 By
代理和对象
---------------------------------

转载于:https://www.cnblogs.com/xinyuyuanm/archive/2013/05/29/3106808.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

suse 内核编译安装_升级SUSE Linux内核的完整步骤!

安装完SLED 10后发现仍然有“热启动网络不通”的问题&#xff0c;原因是内核版本较低&#xff0c;于是升级到2.6.17版内核&#xff0c;成功解决此问题。为了造福广大菜鸟&#xff0c;分享一下我的经验&#xff0c;欢迎高手批评补充。1。将下载的新内核(比如linux-2.6.17.tar.bz…

C语言逆序字符串(递归实现)

算法思想 以字符串“abcdef”为例 1.将a保存到temp中 2.将f放到a的位置 3.f处填写‘\0’ 4.计算bcde的长度 5.如果bcde的长度大于1&#xff0c;则逆序 6.将a放到f的位置 #include <stdio.h> #include<string.h> int my_strlen(char* str) {char* start str;char*…

android 自定义控件

自定义一般分三种情况 1. 自定义布局 2. 自定义控件 3.直接继承View 下面来着eoe例子&#xff0c;实现自定义控件 1. 自定义属性 res/values/attrs.xml 自定义属性 <?xml version"1.0" encoding"utf-8"?> <resources><declare-styleable …

某项目要调用现有的100多个DLL 一 开始

某个项目需要使用很多内部其他Team的DLL 和第三方的DLL (大概百来个吧......这是什么鬼啊...可怕的历史,又不能改 这些dll都上生产环境了) 如果直接用dll引用之后调用 会有很多很多的问题 1.程序的质量会下降到 这百来个dll中质量最差的一个 (万一某些人在代码里面写什么lock(…

Hibernate3 jar包的作用[转]

from:http://nopainnogain.iteye.com/blog/761630 &#xff08;1&#xff09;hibernate3.jar: Hibernate的核心库&#xff0c;没有什么可说的&#xff0c;必须使用的jar包 &#xff08;2&#xff09;cglib-asm.jar: CGLIB库&#xff0c;Hibernate用它来实现PO字节码的动态生成&…

Linux下mysql整库备份

基本语法&#xff1a;mysqldump -u[mysql账户名] -p [--default-character-setutf8] [--max_allowed_packet50M]数据库名 >文件保存路径.示例&#xff1a; mysqldump -uroot -p --default-character-setutf8 --max_allowed_packet50M hyman > /web/hyman.sql转载于:htt…

svr公式推导_支持向量回归(SVR)的详细介绍以及推导算法

1 SVR背景2 SVR原理3 SVR数学模型SVR的背景SVR做为SVM的分支从而被提出&#xff0c;一张图介绍SVR与SVM的关系这里两虚线之间的几何间隔rd ∣ ∣ W ∣ ∣ \frac{d}{||W||}∣∣W∣∣d​,这里的d就为两虚线之间的函数间隔。(一图读懂函数间隔与几何间隔)这里的r就是根据两平行线之…

计算整数中各位数字之和

#include<stdio.h> int digit_sum(int num) {int temp num % 10;if (num > 9)return temp digit_sum(num / 10);elsereturn temp; } int main() {int num 0;scanf("%d", &num);int sumdigit_sum(num);printf("%d\n", sum);return 0; }

Office文档模型深入---Outlook文档模型与开发实战(1)

简介 本篇为Office文档模型深入系列第4篇&#xff0c;原计划是Excel的图表&#xff0c;之后是Word&#xff0c;因为项目转手需要总结Outlook&#xff0c;先改变下顺序&#xff0c;后面的内容会慢慢补上。本篇为Outlook子系列的第一篇&#xff0c;主要介绍下outlook命名空间下…

VS2003,VS2005,VS2008 低版本打开高版本的解决方案和工程文件

一、用记事本打开sln文件&#xff0c;将&#xff1a; Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 改成&#xff1a; Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 二、用记事本打开csproj文件&a…

写一个js向左滑动删除 交互特效的插件——Html5 touchmove

需求描述 需要实现类似QQ中对联系人的操作&#xff1a;向左滑动&#xff0c;滑出删除按钮。滑动超过一半时松开则自动滑到底&#xff0c;不到一半时松开则返回原处。 纯js实现 使用了h5的touchmove等事件&#xff0c;以及用js动态改变css3的translate属性来达到动画效果&#x…

指数高通滤波器代码_高通滤波法、微分算子法、神经网络方法实现图像边缘检测...

边缘检测(Edge detection)是图像处理和计算机视觉中的基本问题&#xff0c;边缘检测的目的是标识数字图像中亮度变化明显的点。本文使用多种不同的方法&#xff0c;实现对 Lena 肖像的边缘检测&#xff0c;研究分析各算法的效果和优缺点。所涉及的方法如下&#xff1a;高通滤波…

Extjs prompt 显示密码框

Extjs 的 prompt 默认是普通的输入框&#xff0c;我们可以通过获取里面的元素&#xff0c;自己改一下。。呵呵 Ext.Msg.prompt("密码","请输入密码:",function(btn,text){if(btn "ok"){Ext.Msg.alert("ok...","验证密码。。。&q…

Android----Fragments详解

Fragments 概念是在Android3.0版本就已经有了&#xff0c;3.0版本是Tab(平板)专用&#xff0c;后来在4.0以上的版本继续沿 用Fragments&#xff0c;改善了Activity的灵活性。 在没有Fragments之前&#xff0c;一个屏幕就只能放一个Activity&#xff0c;有了Fragments之后&#…

matlab中find()函数用法

一.基本用法 返回矩阵或向量中非零元素的索引 注意&#xff1a;matlab中下标从1开始 举例&#xff1a; &#xff08;1&#xff09;向量 返回非零元素下标 find&#xff08;vector&#xff09; x[1 2 3 0 0 6 7 8 9]; find(x)ans 1 2 3 6 7 8 9返回前…

Hadoop Mapreduce分区、分组、二次排序过程详解

2019独角兽企业重金招聘Python工程师标准>>> 1、MapReduce中数据流动 &#xff08;1&#xff09;最简单的过程&#xff1a; map - reduce &#xff08;2&#xff09;定制了partitioner以将map的结果送往指定reducer的过程&#xff1a; map - partition - redu…

python set判断一个键是否存在_python redis 有序集合sorted set检查某个键是否存在

redis有序集合(Sorted Set)命令ZADDZREMZCARDZCOUNTZSCOREZINCRBYZRANGEZREVRANGEZRANGEBYSCOREZREVRANGEBYSCOREZRANKZREVRANKZREMRANGEBYRANKZREMRANGEBYSCOREZINTERSTOREZUNIONSTORE从上面命令中看到&#xff0c; redis的有序集合(Sorted Set)没有命令判断键是否存在于有序集…

软件过程改进之百科名片

软件过程改进/过程改进&#xff08;Software Process improvement&#xff0c;SPI&#xff09;帮助软件企业对其软件(制作)过程的改变(进)进行计划、(措施)制定以及实施。他的实施对象就是软件企业的软件过程&#xff0c;也就是软件产品的生产过程&#xff0c;当然也包括软件维…

python实现计算字符串或列表中每个字符出现的次数,并打印出现次数最多的字符

chars[a,c,x,d,p,a,m,q,s,t,p,a,t,c,c] char1sabcdcdefasbcd dict{} #创建一个空字典 for x in chars: #for循环遍历列表或字符串&#xff0c;如果字符在字典中则value加1&#xff0c;如果不在则创建&#xff08;key,value),key字符&#xff0c;value1if dict.get(x)None:dict…

基于 OpenFire 的TVBox管理平台开发笔记

目录 一、開發環境設置.... 3 1.1 JDK 安裝.... 3 1.2 MySql Server安裝.... 4 1.3 OpenFire安裝.... 6 1.4 Openfire Admin 功能.... 14 1.4.1 用戶摘要&#xff1a;.... 16 1.4.2 組摘要&#xff1a;.... 16 1.4.3 用戶組管理&#xff1a;.... 17 1.4.4 發送管理消息&#xf…