代理模式(Proxy Pattern)
# 代理模式(Proxy Pattern)
# 概念
代理模式(Proxy Pattern)是一种结构型设计模式,它提供了一个代理对象,充当了客户端和实际对象之间的中介。代理模式允许通过代理对象控制对实际对象的访问,并在访问时添加额外的功能。
# 思想
代理模式的核心思想是在访问对象之前和之后进行一些额外的操作,而不需要直接访问实际对象。代理模式可以用于实现延迟加载、权限控制、缓存等功能。
# 角色
- Client(客户端):客户端通过代理对象来访问实际对象。
- Subject(抽象主题):定义了实际对象和代理对象的共同接口。
- RealSubject(实际主题):实现了抽象主题接口,是客户端真正需要访问的对象。
- Proxy(代理):实现了抽象主题接口,并持有一个实际主题对象的引用。代理对象在访问实际主题之前或之后可以执行一些额外的操作。
# 优点
- 可以实现对客户端透明,客户端无需知道实际对象的存在。
- 可以控制对实际对象的访问,提供额外的功能,如权限验证、缓存等。
- 可以实现延迟加载,只有在真正需要时才创建实际对象。
- 可以对实际对象进行保护,防止非法访问。
# 缺点
- 增加了系统复杂性,引入了额外的类和接口。
- 可能会导致请求的处理速度变慢,因为需要通过代理对象来访问实际对象。
# 类图
以下是代理模式的类图,使用PlantUML绘制:
@startuml
class Client {
+request()
}
interface Subject {
+request()
}
class RealSubject {
+request()
}
class Proxy {
-realSubject: RealSubject
+request()
}
note left of Client::request
proxy.request();
@enduml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 示例代码
下面是一个使用C++实现的简单代理模式示例:
#include <iostream>
// Subject(抽象主题)
class Subject {
public:
virtual void request() = 0;
};
// RealSubject(实际主题)
class RealSubject : public Subject {
public:
void request() override {
std::cout << "RealSubject: Handling request." << std::endl;
}
};
// Proxy(代理)
class Proxy : public Subject {
private:
RealSubject* realSubject;
public:
Proxy() {
realSubject = new RealSubject();
}
~Proxy() {
delete realSubject;
}
void request() override {
std::cout << "Proxy: Pre-processing request." << std::endl;
realSubject->request();
std::cout << "Proxy: Post-processing request." << std::endl;
}
};
int main() {
Subject* proxy = new Proxy();
proxy->request();
delete proxy;
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
代码运行结果:
Proxy: Pre-processing request.
RealSubject: Handling request.
Proxy: Post-processing request.
1
2
3
2
3
示例代码中,客户端(Client)通过代理对象(Proxy)来访问实际对象(RealSubject)。在代理对象的request()
方法中,会在访问实际对象之前进行预处理,输出"Proxy: Pre-processing request.";然后调用实际对象的request()
方法,输出"RealSubject: Handling request.";最后在访问实际对象之后进行后处理,输出"Proxy: Post-processing request."。这样,通过代理对象,实现了在访问实际对象前后添加额外功能的目的。
编辑 (opens new window)
上次更新: 2023/06/09, 13:17:31
- 01
- Linux系统移植(五)--- 制作、烧录镜像并启动Linux02-05
- 03
- Linux系统移植(三)--- Linux kernel移植02-05