//---------------------------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的更多相关文章

  1. 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)

    原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...

  2. 大熊君说说JS与设计模式之------代理模式Proxy

    一,总体概要 1,笔者浅谈 当我们浏览网页时,网页中的图片有时不会立即展示出来,这就是通过虚拟代理来替代了真实的图片,而代理存储了真实图片的路径和尺寸,这就是代理方式的一种. 代理模式是比较有用途的一 ...

  3. 二十四种设计模式:代理模式(Proxy Pattern)

    代理模式(Proxy Pattern) 介绍为其他对象提供一个代理以控制对这个对象的访问. 示例有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对 ...

  4. Java基础-设计模式之-代理模式Proxy

    代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理 ...

  5. [设计模式] 12 代理模式 proxy

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对代理模式是这样说的:为其他对象提供一种代理以控制对这个对象的访问.结合上面的游戏代理的例子和下面的图,我们来进行分析一下.以前你是这 ...

  6. c#设计模式之代理模式(Proxy Pattern)

    引言 代理这个词语,大家在现实世界已经频繁的接触过,例如火车站代理售票点,因为这些代理售票点的存在,我们不必要去火车站的售票处就可以查询或者取到火车票.代理点本身是没有能力生产车票的,我们在代理处享受 ...

  7. 学习笔记——代理模式Proxy

    代理模式,主要是逻辑和实现解耦.具体逻辑如何,由代理Proxy自己来设计,我们只需要把逻辑Subject交给代理即可. 主要应用场景,包括创建大开销对象时,使用代理来慢慢创建:远程代理,如网络不确定时 ...

  8. 设计模式三: 代理模式(Proxy) -- JDK的实现方式

    简介 代理模式属于行为型模式的一种, 控制对其他对象的访问, 起到中介作用. 代理模式核心角色: 真实角色,代理角色; 按实现方式不同分为静态代理和动态代理两种; 意图 控制对其它对象的访问. 类图 ...

  9. 【设计模式】—— 代理模式Proxy

    前言:[模式总览]——————————by xingoo 模式意图 代理模式为其他的对象增加一个代理对象,进行访问控制.从而避免直接访问一个对象,造成效率或者安全性上的降低. 应用场景 1 远程代理, ...

随机推荐

  1. python常用模块之string

    python常用模块string模块,该模块可以帮我们获取字母.数字.特殊符号. import string #打印所有的小写字母 print(string.ascii_lowercase) #打印所 ...

  2. Android Studio之could not reserve enough space for object heap报错

    在用AndroidStudio时出现这样的错误:  搞了半天终于找到了解决办法,但是很麻烦.就是每次创建工程后,在gradle.properties文件中加入如下代码: org.gradle.jvma ...

  3. 64位的Sql Server使用OPENROWSET导入xlsx格式的excel数据的时候报错(转载)

    In the old times while all the CPUs were 32bit, we were happily using JET OLEDB Provider reaching Ex ...

  4. SQL Server 从2000复制数据到2008及以上版本的一种方法

    1.通过Linked Servers 执行sql出现错误提示,无法执行复制数据操作. sql: insert into tb_User select from [**.**.*.**].DB.dbo. ...

  5. 怎样使用 virt-viewer 远程访问 qemu 虚拟机 - 转载

    How to connect to a VM hosted on QEMU remotely using virt-viewer I couldn’t find comprehensive artic ...

  6. [Spark Core] Spark 核心组件

    0. 说明 [Spark 核心组件示意图] 1. RDD resilient distributed dataset , 弹性数据集 轻量级的数据集合,逻辑上的集合.等价于 list 没有携带数据. ...

  7. 记录一次优化mysql查询语句的方法

    今天在数据库中导入大量的数据,大概有25万条,结果在查询的时候优化没有做好,因此导致查询意外停止或者是直接查询程序中止,很是苦恼.所以才有了优化查询的方法总结 1.首先是查看一下数据量 2.接下来按照 ...

  8. sdn2017 第三次作业

    1.阅读: 阅读<图解openflow>第一二章(请自己查找相应书籍) 阅读文章:http://www.sdnlab.com/19777.html 阅读<重构网络>第一二章 2 ...

  9. 【Alpha 冲刺】 7/12

    今日任务总结 人员 今日原定任务 完成情况 遇到问题 贡献值 胡武成 建立数据库 已完成 孙浩楷 完成作业列表界面 已完成 胡冰 完成作业展示页面 已完成 练斐弘 完成课件列表页面 未完成 时间不够 ...

  10. loli的混合算法测试

    最近刚讲了最短路,说要考试我以为是考最短路,然而只有一道是最短路... 数据似乎有一点问题,不管了,反正手工测评都是对的,那现在就来看看题吧. Balanced:(此处并没有网址) 题意概述:$n$  ...