介绍
-
代理模式是一种结构型设计模式
-
代理-》委托类(继承自抽象基类),通过代理类,来实际控制对象的访问权限
代码实现
假设场景:视频网站观看不同的电影需要不同的访问权限
class VideoSite
{
public:
virtual void freeMovie() = 0; // 免费电影
virtual void vipMovie() = 0; // VIP电影
virtual void ticketMovie() = 0; // 用券观看的电影
};
// 委托类 #2实际调用资源的类
class HotVideoSite : public VideoSite
{
public:
virtual void freeMovie()
{
cout << "观看免费电影" << endl;
}
virtual void vipMovie()
{
cout << "观看VIP电影" << endl;
}
virtual void ticketMovie()
{
cout << "用券观看电影" << endl;
}
};
// 代理类 #3 代理HotVideoSite
class FreeVideoSiteProxy : public VideoSite
{
public:
virtual void freeMovie()
{
Video.freeMovie();
}
virtual void vipMovie()
{
cout << "您目前只是普通游客,需要升级成VIP,才能观看VIP电影" << endl;
}
virtual void ticketMovie()
{
cout << "您目前没有券,需要购买电影券,才能观看电影" << endl;
}
private:
HotVideoSite Video; // 组合
};
// 代理类 #3 代理HotVideoSite
class VipVideoSiteProxy : public VideoSite
{
public:
VipVideoSiteProxy() { pVideo = new HotVideoSite(); }
~VipVideoSiteProxy() { delete pVideo; }
virtual void freeMovie()
{
pVideo->freeMovie();
}
virtual void vipMovie()
{
pVideo->vipMovie();
}
virtual void ticketMovie()
{
cout << "您目前没有券,需要购买电影券,才能观看电影" << endl;
}
private:
HotVideoSite *pVideo; // 组合
};
// 通用的API接口,使用的都是基类指针或 引用
void watchMovie(unique_ptr<VideoSite>& ptr)
{
ptr->freeMovie();
ptr->vipMovie();
ptr->ticketMovie();
}
int main()
{
unique_ptr<VideoSite> p1(new FreeVideoSiteProxy()); // 客户只能通过代理对象来访问资源
unique_ptr<VideoSite> p2(new VipVideoSiteProxy());
watchMovie(p1);
watchMovie(p2);
return 0;
}