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
class VideoPlayer {
public:
virtual void listVideos() = 0;
virtual void getVideoInfo(int id) = 0;
virtual void downloadVideo(int id) = 0;
};

class BasicVideoPlayer : public VideoPlayer {
public:
void listVideos() override {

}

void getVideoInfo(int id) override {

}

void downloadVideo(int id) override {

}
};

class CachedVideoPlayer : public VideoPlayer {
private:
std::unique_ptr<VideoPlayer> videoPlayer;
public:
CachedVideoPlayer(std::unique_ptr<VideoPlayer> && videoPlayer): videoPlayer(std::move(videoPlayer)) {

}

void listVideos() override {

}

void getVideoInfo(int id) override {

}

void downloadVideo(int id) override {

}

};

示例中VideoPlayer类是一个接口类。BasicVideoPlayer是一个基本的播放类,但是该类的效率非常低,如果客户端多次请求同一个视频,该类会反复下载该视频。CachedVideoPlayer内部组合了一个VideoPlayer,同时也实现了VideoPlayer的接口。CachedVideoPlayer会讲实际下载的工作委派给源下载器,同时CachedVideoPlayer会将已经下载的视频进行缓存,不会多次反复下载同一个视频。