代理模式简介
代理模式和装饰模式在代码结构上没什么差别,只是代码模式和装饰模式的目的和对内部对象的管理行为不同。代理模式能为对象提供行为基本相同的接口, 装饰模式则能为对象提供加强的接口。代理模式通常自行管理其服务对象的生命周期, 而装饰的生成则总是由客户端进行控制。
使用代理模式的场景
- 延迟初始化
- 访问控制
- 打包请求,收到请求后不立即去请求,而是将将多个请求一起发出
代码示例
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会将已经下载的视频进行缓存,不会多次反复下载同一个视频。