13 结构型模式-----代理模式

模式动机(Proxy Pattern)引入一个代理对象负责对真实对象的访问。将代理对象和真实对象的公共接口提取出来,用Subject接口表示。具体结构图及其分析如下:

模式结构图:

模式代码:

bt_代理模式.h

 1 #ifndef PP_H
 2 #define PP_H
 3 #include <iostream>
 4 using namespace std;
 5
 6 /*
 7     抽象主题类,定义了RealSubject和Proxy的公共接口,这样就可以在
 8     使用RealSubject的地方使用Proxy了
 9 */
10 class Subject
11 {
12 public:
13     virtual ~Subject(){ }
14     virtual void Request() = 0;
15 };
16
17 /*
18     具体主题类,表示Proxy所代表的实体类
19 */
20 class RealSubject : public Subject
21 {
22 public:
23     virtual void Request()
24     {
25         std::cout << "Call RealSubject::Request()" << std::endl;
26     }
27 };
28
29 /*
30     代理类,保存一个引用指向RealSubject,使得可以控制实体的使用
31 */
32 class Proxy : public Subject
33 {
34 public:
35     Proxy(){ realSubject = new RealSubject; }
36
37     virtual void Request()
38     {
39         realSubject->Request();
40     }
41
42     ~Proxy(){ delete realSubject; }
43
44 private:
45     RealSubject* realSubject;
46 };
47
48 #endif // PP_H

测试用例.cpp:

 1 #include "bt_代理模式.h"
 2
 3 int main()
 4 {
 5     std::cout << "***** 代理模式测试 *****" << std::endl;
 6     Subject* pSub = new Proxy;
 7     pSub->Request();
 8
 9     delete pSub;
10
11     return 0;
12 }


模式分析:

代理(Proxy)模式在访问真实对象时引入了一定程度的间接性。其中主要有如下几种类型:

1》 远程代理(Remote Proxy)当访问一个位于不同地址空间的对象时,提供一个本地代理对象进行操作远程实体。

2》 虚拟代理(virtual Proxy)当访问一个占用内存比较大的对象时,先创建一个比较小的代理实现对象预览功能,等到确实需要访问源对象时再创建真实对象的实体,这样可以达到资源的最优利用。如打开浏览器浏览图片时,显示的是小的代理对象,等到点击图片时,才创建真正的实体对象。

3》 保护代理(Protection Proxy)根据不同的用户类型控制对实体对象的访问权限。

4》 智能引用(Smart Reference)在被引用的实体对象上执行一些附加的事务处理等。

5》 拷贝代理(copy-on-write)一般引用对象时只是简单地对引用计数加1,等到真正需要复制实体对象时(比如对象已被修改了),才执行深拷贝操作。

代理模式降低了客户和实体对象之间的耦合性,但是由于增加了代理对象,无形中也会降低系统响应的速度,而且如果设计不当,将会增加系统的复杂性。

时间: 2024-08-14 05:38:15

13 结构型模式-----代理模式的相关文章

设计模式(结构型)之代理模式(Proxy Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之享元模式(Flyweight Pattern)>http://blog.csdn.net/yanbober/article/details/45477551 概述 代理模式是常用的结构型设计模式之一,当无法直接访问某个对象或访问某个对象存在困难时可以通过一个

&quot;围观&quot;设计模式(12)--结构型之代理模式(Proxy Pattern)

维基百科 代理模式(英语:Proxy Pattern)是程序设计中的一种设计模式. 所谓的代理者是指一个类可以作为其它东西的接口.代理者可以作任何东西的接口:网络连接.内存中的大对象.文件或其它昂贵或无法复制的资源.----WIKIPEDIA 个人理解 代理模式就是找另外的一个对象作为代理去为你实施请求,代理模式分为两种,一种是静态代理模式,另外一种是动态代理模式,静态代理模式是代理类为其创建一个对象,将需要代理的类的对象赋予代理类中的该对象,让代理类中该对象去代替需要代理的类的对象去执行一定的

设计模式(结构型)之组合模式(Composite Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之桥接模式(Bridge Pattern)> http://blog.csdn.net/yanbober/article/details/45366781 概述 组合模式又叫做部分-整体模式,使我们在树型结构的问题中模糊简单元素和复杂元素的概念,客户程序可以像

第14章 结构型模式—代理模式

1. 代理模式(Proxy Pattern)的定义 (1)为其他对象提供一种代理以控制对这个对象的访问 ①代理模式在客户和被客户访问的对象之间,引入了一定程度的间接性,客户是直接使用代理,让代理来与被访问的对象进行交互. ②这种附加的间接性增加了灵活性和不同的用途. (2)代理模式的结构和说明 ①Proxy:代理对象,通常实现与具体的目标对象一样的接口,这样就可以使用代理来代替具体的目标对象. A.保存一个指向具体目标对象的指针,可以在需要的时候调用具体的目标对象,若RealSubject和Su

设计模式(结构型)之外观模式(Facade Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之装饰者模式(Decorator Pattern)>http://blog.csdn.net/yanbober/article/details/45395747 概述 一个客户类需要和多个业务类交互,而这些业务类经常会作为整体出现,由于涉及到的类比较多,导致使

设计模式之美学习-结构型-装饰者模式(二十)

什么是装饰者模式 在不破坏被装饰类的业务逻辑的情况下进行增强 同时支持装饰多层,与代理模式很像 装饰者侧重增强,代理侧重控制 Java IO 类图 使用 //FileInputStream是转为用于读取文件流的类 InputStream in = new FileInputStream("/user/wangzheng/test.txt"); //是一个支持带缓存功能的数据读取类 对in进行装饰实现增加 带有缓存 InputStream bin = new BufferedInputS

蓝懿IOS委托模式代理模式

今天刘国斌老师讲了有关oc语言里的委托模式(代理模式),通过了一个打地鼠的游戏讲解了委托模式的功能作用,之后连带讲解了协议的书写和使用. 打地鼠功能包括屏幕随机出现地鼠,点击消失,如果不点击5秒后自动消失,屏幕右上角有一个label显示点击的数量:编写思维是,首先在文件里粗昂见一个类,在类里重写init方法,加上每.5秒出现的事件,倒入viewcontroler文件,在地鼠类里声明一个属性delegate,在button点击事件加上创建对象点delegate调用viewcontroler里的加分

Proxy模式 代理模式

Android的 LocalWindowManager 和 WindowManagerImgl 都实现了WindowManager接口.LocalWindowManager 中保存一个WindowManagerImgl的对象,并将这个对象通过构造对象返回. 即将它的工作委托 WindowManagerImgl 来完成.使用了代理模式 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ? 你有

适配器 蒙面模式 代理模式

这次我把适配器,代理模式,蒙面模式敲了,终于理解了这是怎么回事.C++的设计模式实际上就是软件的功能架构,她想办法处理好类与类之间的关系,让软件好用,易操作,方便修改.软件的所遵循的原则是开闭原则,意思就是开放接口,关闭修改,我们可以去扩展:说到扩展就要提及到这六个字"高内聚,低耦合",我们尽可能的要将功能单一化,一个模块写一个功能,那么我们需要改哪一个功能只需要找到相应就可以,这样做也容易扩展,我增一个功能进来也很easy,举个例子来说吧,假如说一个汽车,我们把汽车可以分为多个模块,