(结构型模式)Proxy——代理模式
一、意图
代理模式:为其他对象提供一种代理以控制对这个对象的访问
二、基本思想
代理模式实际就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。
三、优缺点分析
GOOD:(适用场合)
远程代理:也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象在不同地址空间的事实。
例如:客户端程序调用代理就可以解决远程访问的问题
虚拟代理:是根据需要创建开销很大的对象,通过代理来存放实例化需要很长时间的真实对象,从而达到性能的最优化(例如浏览器使用代理模式来优化下载)。
例如:打开大网页时,未马上打开的图片就是通过虚拟代理来替代了真实的图片,而代理存储了真实图片的路径和尺寸。
安全代理:用来控制真实对象的访问权限
智能引用:当调用真实对象时,代理处理另外一些事
四、标准UML图
五、标准源码
1: #ifndef PROXY_H
2: #define PROXY_H
3:
4: // 定义了Proxy和RealSubject的公有接口,
5: // 这样就可以在任何需要使用到RealSubject的地方都使用Proxy.
6: class Subject
7: {
8: public:
9: Subject(){}
10: virtual ~Subject(){}
11:
12: virtual void Request() = 0;
13: };
14:
15: // 真正使用的实体
16: class RealSubject
17: : public Subject
18: {
19: public:
20: RealSubject();
21: virtual ~RealSubject(){}
22:
23: virtual void Request();
24: };
25:
26: // 代理类,含有一个指向RealSubject对象的指针
27: class Proxy
28: : public Subject
29: {
30: public:
31: Proxy();
32: virtual ~Proxy();
33:
34: virtual void Request();
35:
36: private:
37: RealSubject* m_pRealSubject;
38: };
39: #endif
1: #include "Proxy.h"
2: #include <iostream>
3:
4: RealSubject::RealSubject()
5: {
6: std::cout << "Constructing a RealSubject\n";
7: }
8:
9: void RealSubject::Request()
10: {
11: std::cout << "Request By RealSubject\n";
12: }
13:
14: Proxy::Proxy()
15: : m_pRealSubject(NULL)
16: {
17: std::cout << "Constructing a Proxy\n";
18: }
19:
20: Proxy::~Proxy()
21: {
22: delete m_pRealSubject;
23: m_pRealSubject = NULL;
24: }
25:
26: void Proxy::Request()
27: {
28: // 需要使用RealSubject的时候才去初始化
29: if (NULL == m_pRealSubject)
30: {
31: std::cout << "Request By Proxy\n";
32: m_pRealSubject = new RealSubject();
33: }
34: m_pRealSubject->Request();
35: }
1: #include "Proxy.h"
2: #include <stdlib.h>
3:
4: int main()
5: {
6: Subject* pProxy = new Proxy();
7: pProxy->Request();
8:
9: delete pProxy;
10:
11: system("pause");
12:
13: return 0;
14: }