//---------------------------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. SQLServer的TDE加密

    TDE的主要作用是防止数据库备份或数据文件被偷了以后,偷数据库备份或文件的人在没有数据加密密钥的情况下是无法恢复或附加数据库的. 首先创建SQL Server中master系统数据库的MASTER K ...

  2. SqlServer PIVOT函数快速实现行转列,UNPIVOT实现列转行

    我们在写Sql语句的时候没经常会遇到将查询结果行转列,列转行的需求,拼接sql字符串,然后使用sp_executesql执行sql字符串是比较常规的一种做法.但是这样做实现起来非常复杂,而在SqlSe ...

  3. WLW/OLW 最佳博客写作软件

    前言 我发布到博客园中文章大多是通过Windows live Writer(wlw)来写的,本文记录一下wlw的安装及快捷键. WLW博客园插入代码插件:http://www.cnblogs.com/ ...

  4. python基础学习23----IO模型(简)

    对于一个网络IO(network IO),它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核(kernel).当一个read操作发生时,该操作会经历 ...

  5. 团队作业——Alpha冲刺 10/12

    团队作业--Alpha冲刺 冲刺任务安排 杨光海天 今日任务:编辑界面返回以及预览的intent实现 明日任务:未能按时间要求完成的失败总结 郭剑南 今日任务:优化图像预处理所有功能的函数代码,尝试与 ...

  6. [BUG] python实例化N次类,调用类函数log会输出N遍的bug 解决办法

    最近再写DOU用例时,采用的是 unittest测试框架,就涉及到将其它所有模块需要全部在一个 .py文件中进行实例化,然后再运行时发现在控制台中同一个日志信息会打印多次(实例化几次,同一消息就会打印 ...

  7. 有关于分布式缓存Hazelcast

    如果在内网段中部署或者启动缓存服务.不能存在相同的组名称.如同使用dubbo一样,会导致无法连接到缓存节点

  8. BZOJ5369:[PKUSC2018]最大前缀和(状压DP)

    Description 小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和. 但是小C并不会做这个题,于是小C决定把序列随机打乱,然后取序列的最大前缀和作为答案. 小C ...

  9. P1231 教辅的组成

    传送门:https://www.luogu.org/problemnew/show/P1231 这是一道很不错的网络流入门题,关键在于如何建图. 首先,我们将练习册和源点连一条边权为1的边,然后若书 ...

  10. docker容器下tomcat 不向catalina.out输出日志解决以及支持中文字符集

    docker容器下tomcat 不向catalina.out输出日志解决 去掉 & 符号,直接 使用 ENTRYPOINT ["/data/tomcat/bin/startup.sh ...