设计模式笔记:代理模式

概述

代理模式是一种结构型设计模式,代理类管理委托类的访问权限和添加功能。

示例

假设有一个视频类,用户可以通过这个类来播放视频。但是,希望在用户播放视频之前,验证他们是否有权限。可以创建一个代理类来完成这个任务。

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
#include <iostream>

class Video {
public:
virtual void play() = 0;
};

class RealVideo : public Video {
std::string filename;
public:
RealVideo(const std::string &filename): filename(filename) {}
void play() override {
std::cout << "Playing video " << filename << std::endl;
}
};

class VideoProxy : public Video {
std::string filename;
RealVideo* video = nullptr;
public:
VideoProxy(const std::string &filename): filename(filename) {}
void play() override {
if (video == nullptr) {
video = new RealVideo(filename);
}
video->play();
}
~VideoProxy() {
delete video;
}
};

int main() {
Video* video = new VideoProxy("test.mp4");
video->play();

delete video;

return 0;
}

总结

在这个例子中,我们首先定义了一个Video接口,它有一个play方法。然后我们创建了一个RealVideo类,它实现了Video接口,并实现了play方法。

然后我们创建了一个VideoProxy类,它也实现了Video接口。VideoProxy类有一个RealVideo对象的指针,当play方法被调用时,它会创建一个RealVideo对象(如果还没有创建)并调用它的play方法。

在main函数中,我们创建了一个VideoProxy对象,并通过它来播放视频。这样,我们就可以在不改变RealVideo类的情况下,添加额外的逻辑,如权限验证。这就是代理模式的主要优点。

这个例子中并没有实现权限验证的逻辑,可以在VideoProxy的play方法中添加适当的逻辑来完成这个任务