//---------------------------15/04/21----------------------------
//Proxy 代理模式-----对象结构型模式
/*
1:意图:
为其他对象提供一种代理以控制对这个对象的访问。
2:别名:
Surrogate
3:动机:
4:适用性:
1>远程代理:
为一个对象在不同的地址空间提供局部代表。
2>虚代理:
根据需要创建开销很大的对象。
3>保护代理:
控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。
4>指针指引:
取代简单的指针,它在访问对象时执行一些附加操作:
1)统计指向实际对象的引用次数,这样对象没有引用时可以自动释放。(智能指针)
2)当第一次引用一个持久对象时,将它装入内存。(懒加载)
3)在访问一个实际对象前,检查是否已经锁定了它,保证其他对象不能改变它。(多线程加锁)
5:结构:
Client------------->Subject:
Request()
|
|
-------------------
| |
| Proxy:
RealSubject:<-------realSubject
Request() Request()
{...
realSubject->Request();
...}
6:参与者:
1>Proxy:
1)保存一个引用使得代理可以访问实体
2)提供一个与Subject的接口相同的接口,这样代理就可以用来代替实体了。
3)控制对实体的存取,并可能负责创建和删除它。
4)其他功能以来于代理的类型:
1-Remote Proxy:负责对请求及其参数进行编码,并向不同地址空间中的实体发送已编码的请求。
2-Virtual Proxy:可以缓存实体的附加信息,以便延迟对它的访问。
3-Protection Proxy:检查调用者是否具有实现一个请求所必需的访问权限。
2>Subjet:
定义RealSubject和Proxy的公共接口,这样就在任何使用RealSubject的地方都可以使用Proxy。
3>RealSubject:
定义Proxy所代表的实体。
7:协作:
代理根据其种类,在适当的时候向RealSubject转发请求。
8:效果:
1>Remote Proxy可以隐藏一个对象存在于不同地址空间的事实。
2>Virtual Proxy可以进行最优化,例如根据要求创建对象。
3>Protecition Proxies 和 Smart Reference都允许在访问一个对象时有一些附加的内务处理。
4>Copy-on-wirte:
拷贝一个庞大的对象是开销很大的操作,如果这个拷贝没有被修改,那么这些开销就没必要,所以可以使用
代理,来延迟拷贝的动作,一开始代理只增加实体一个引用计数,当用户需要修改这份拷贝时,再真正执行
拷贝动作,并减少引用计数。
9:实现:
1>重载C++中的存取运算符
C++支持重载->和*运算符。所以重载这两个操作符来加载真正的对象,在没有使用前(没调用这两个操作符前)
我们可以不用加载。
2>Proxy并不总是需要知道实体的类型。
1)不需要实例化实体时。并不需要为具体的RealSubject类生成特定的Proxy类;Proxy类可以统一处理
所有的这样的RealSubject类。
2)需要实例化实体时。在实例化之前,可以使用某种特定的标识符来表示实体,比如文件路径。
10:代码示例: */
//Subject类,定义了RealSubject和Proxy的接口
class Graphic
{
public:
virtual ~Graphic();
virtual void Draw(const Point& at) =
;
virtual void HandleMouse(Event& event)=
;
virtual const Point& GetExtent()=
;
virtual void Load(istream& form)=
;
virtual void Save(ostrean& to)=
;
protected:
Graphic();
};
//RealSubject类
class Image :
public Graphic
{
public:
Image(const
char* file);
virtual ~Image();
virtual void Draw(const Point& at);
virtual void HandleMouse(Event& event);
virtual const Point& GetExtent();
virtual void Load(istream& form);
virtual void Save(ostrean& to);
private:
...
};
//Proxy类
class ImageProxy :
public Graphic
{
public:
ImageProxy(const
char* file);
virtual ~ImageProxy();
virtual void Draw(const Point& at);
virtual void HandleMouse(Event& event);
virtual const Point& GetExtent();
virtual void Load(istream& form);
virtual void Save(ostrean& to);
protected:
Image* GetImage();
private:
Image* _image;
Point _extent;
char* fileName;
};
//构造函数,接受一个fileName(cosnst char*)参数
ImageProxy::ImageProxy(const
char* fileName)
{
_fileName = strdup(fileName);
_extent = Point::Zero;
_image =
;
}
//只有这时才会真正创建出Image
Image* ImageProxy::GetImage()
{
)
{
_image =
new Image(_fileName);
}
return _image;
}
//如果已经缓存过,就直接返回_exyent
const Point& ImageProxy::GetExtent()
{
if(_extent == Point::Zero)
_extent = GetImage()->GetExtent();
return _extent;
}
//实现继承的接口
void ImageProxy::Draw(const Point& at)
{
GetImage()->Draw(at);
}
void ImageProxy::HandleMouse(Event& event)
{
GetImage()->HandleMouse(event);
}
void ImageProxy::Save(ostrean& to)
{
to<< _extent << _fileName;
}
void ImageProxy::Load(istream& from)
{
from >> _extent >> _fileName;
}
class TextDocument
{
public:
TextDocument();
void Insert(Graphic*);
};
//如何使用
TextDocument* text =
new TextDocument;
text->Insert(new ImageProxy("naImageFileName"));
设计模式 笔记 代理模式 Proxy的更多相关文章
-
乐在其中设计模式(C#) - 代理模式(Proxy Pattern)
原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...
-
大熊君说说JS与设计模式之------代理模式Proxy
一,总体概要 1,笔者浅谈 当我们浏览网页时,网页中的图片有时不会立即展示出来,这就是通过虚拟代理来替代了真实的图片,而代理存储了真实图片的路径和尺寸,这就是代理方式的一种. 代理模式是比较有用途的一 ...
-
二十四种设计模式:代理模式(Proxy Pattern)
代理模式(Proxy Pattern) 介绍为其他对象提供一个代理以控制对这个对象的访问. 示例有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对 ...
-
Java基础-设计模式之-代理模式Proxy
代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理 ...
-
[设计模式] 12 代理模式 proxy
在GOF的<设计模式:可复用面向对象软件的基础>一书中对代理模式是这样说的:为其他对象提供一种代理以控制对这个对象的访问.结合上面的游戏代理的例子和下面的图,我们来进行分析一下.以前你是这 ...
-
c#设计模式之代理模式(Proxy Pattern)
引言 代理这个词语,大家在现实世界已经频繁的接触过,例如火车站代理售票点,因为这些代理售票点的存在,我们不必要去火车站的售票处就可以查询或者取到火车票.代理点本身是没有能力生产车票的,我们在代理处享受 ...
-
学习笔记——代理模式Proxy
代理模式,主要是逻辑和实现解耦.具体逻辑如何,由代理Proxy自己来设计,我们只需要把逻辑Subject交给代理即可. 主要应用场景,包括创建大开销对象时,使用代理来慢慢创建:远程代理,如网络不确定时 ...
-
设计模式三: 代理模式(Proxy) -- JDK的实现方式
简介 代理模式属于行为型模式的一种, 控制对其他对象的访问, 起到中介作用. 代理模式核心角色: 真实角色,代理角色; 按实现方式不同分为静态代理和动态代理两种; 意图 控制对其它对象的访问. 类图 ...
-
【设计模式】—— 代理模式Proxy
前言:[模式总览]——————————by xingoo 模式意图 代理模式为其他的对象增加一个代理对象,进行访问控制.从而避免直接访问一个对象,造成效率或者安全性上的降低. 应用场景 1 远程代理, ...
随机推荐
-
Asp.net using Oracle.DataAccess.dll access oracle 11g 64bit &; x86
使用.net访问oracle数据库时一般需要在机器上安装instantclient才能正常连接. 下面介绍一种不用安装instantclient直接引用dll就用.net能连接oracle数据库的方法 ...
-
JPA与Hibernate的关系
1.JPA JPA全称: Java Persistence API JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. JPA的出现? JPA ...
-
MPlayer-ww 增加边看边剪切功能
解压到 D:\MPlayer-ww 运行 copy_font.bat 安装字体 LED_font.ttf 双击 MPlayer_ww_openWith.reg 添加右键播放功能 outformat.i ...
-
data-*属性——使用自定义属性的方式存储数据
HTML5提供了data-*属性能存储页面或应用程序的私有自定义数据.只需在属性前加上data-前缀即可,值可以是任意字符串. 存储的(自定义)数据能够被页面的 JavaScript 中利用,以创建更 ...
-
Hibernate中的多对多映射
1.需求 项目与开发员工 一个项目,有多个开发人员 一个开发人员,参与多个项目 [多对多] 2.实体bean设计 Project: public class Project { private int ...
-
设计模式之单实例模式(Singleton)
原理:将类的构造函数由pubic变为private或者protect,添加获取对象的public 成员函数,返回指向对象的静态指针. 首先来一段简单的代码实现 代码一 class Singleton ...
-
深入.NET平台和C#编程
第一章 深入.NET框架 1.Microsoft.NET框架概述: 1).NET介绍 2)为什么需要.NET框架 通过如下两个问题说明为什么需要.NET框架 01,C#程序可以再不同平台(PDA,P ...
-
腾讯云GAME-TECH游戏开发者技术沙龙(深圳)开启报名啦~
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~. 作者:由腾讯游戏云发表在云+社区 腾讯云GAME-TECH沙龙继1月杭州站后,将于3月30日来到深圳站,与游戏厂商和游戏开发者,畅聊游戏安 ...
-
ubuntu安装使用ffmpeg
环境:ubuntu 12.04 LTS (1)到http://www.ffmpeg.org/download.html下载最新版ffmpeg 也可以用这个命令: git clone git://sou ...
-
关于Web应用开发流程的总结
以下内容为个人工作总结,如果不当,谢谢指出错误. 假设最简单的情况,一个开发人员,开发所有的代码,一个测试人员.一个测试的服务器,一个生产的服务器. 开发人员需要为公司开发一个项目,开发人员首先分析产 ...