/*
代理Proxy模式:通过代理类,来控制实际对象的访问权限
客户 助理Proxy 老板
*/
class VideoSite //抽象类
{
public:
virtual void freeMovie() = 0; //免费电影
virtual void vipMovie() = 0; //vip电影
virtual void ticketMovie() = 0; //用券观看电影
};
class FixBugVideoSite : public VideoSite//委托的类
{
public:
virtual void freeMovie() //免费电影
{
cout << "观看免费电影" << endl;
}
virtual void vipMovie() //vip电影
{
cout << "观看vip电影" << endl;
}
virtual void ticketMovie() //用券观看电影
{
cout << "用券观看电影" << endl;
}
};
//代理类 代理FixBufVideoSite
class FreeVideoSiteProxy : public VideoSite
{
public:
FreeVideoSiteProxy() { pVideo = new FixBugVideoSite(); }
~FreeVideoSiteProxy() { delete pVideo; }
virtual void freeMovie() //免费电影
{
pVideo->freeMovie();//通过代理对象的freeMovie来访问真正委托类对象的freeMovie
}
virtual void vipMovie() //vip电影
{
cout << "您目前只是普通游客,需要升级成vip,才能观看vip电影" << endl;
}
virtual void ticketMovie() //用券观看电影
{
cout << "您目前没有券,需要购买电影券,才能观看电影" << endl;
}
private:
VideoSite *pVideo;
};
//代理类 代理FixBufVideoSite
class VipVideoSiteProxy : public VideoSite
{
public:
VipVideoSiteProxy() { pVideo = new FixBugVideoSite(); }
~VipVideoSiteProxy() { delete pVideo; }
virtual void freeMovie() //免费电影
{
pVideo->freeMovie();//通过代理对象的freeMovie来访问真正委托类对象的freeMovie
}
virtual void vipMovie() //vip电影
{
pVideo->vipMovie();
}
virtual void ticketMovie() //用券观看电影
{
cout << "您目前没有券,需要购买电影券,才能观看电影" << endl;
}
private:
VideoSite *pVideo;
};
//这些都是通用的API接口,使用的都是基类的指针或引用
void watchMovice(unique_ptr<VideoSite> &ptr) {
ptr->freeMovie();
ptr->vipMovie();
ptr->ticketMovie();
}
int main()
{
unique_ptr<VideoSite> p1(new FreeVideoSiteProxy());
unique_ptr<VideoSite> p2(new VipVideoSiteProxy());
watchMovice(p1);
watchMovice(p2);
return 0;
}
设计模式-代理模式
最新推荐文章于 2024-01-06 11:32:36 发布