设计模式 - Proxy模式(代理模式)
作用:
为其他对象提供一种代理以控制对这个对象的访问。
UML结构图:
抽象基类:
1)Subject:定义了Proxy和RealSubject的公有接口,这样就可以在任何需要使用到RealSubject的地方都使用Proxy。
解析:
Proxy其实是基于这样一种时常使用到的技术-某个对象直到它真正被使用到的时候才被初始化,在没有使用到的时候就暂时用Proxy作一个占位符.这个模式实现的要点就是Proxy和RealSubject都继承自Subject,这样保证了两个的接口都是一致的。
代码实现:
Proxy.h
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
40
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
40
Proxy.cpp
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 }
36
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 }
36
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 }
15
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 }
15