定义:代理模式是一种结构性设计模式,它为其他对象提供一种代理以控制该对象的访问。通过代理对象,可以对实际对象的功能进行增强、限制、延迟加载等操作,而不改变实际对象的代码。
角色:抽象主题(抽象基类)+真实主题(委托类:实际完成功能得类)+代理(内部有一个基类指针,并控制访问权限)

#include <iostream>
#include <memory>
using namespace std;
/*
代理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()
{
cout << "观看vip电影" << endl;
}
virtual void ticketMovie()
{
cout << "用券观影" << endl;
}
};
// 代理类 代理FixBugVideoSite
class FreeVideoSiteProxy : public VideoSite
{
public:
FreeVideoSiteProxy() { pVideo = new FixBugVideoSite();}
~FreeVideoSiteProxy(){ delete pVideo; }
virtual void freeMovie()
{
pVideo->freeMovie(); // 通过代理对象的freeMovie, 来访问真正委托类对象的freeMoive
}
virtual void vipMovie()
{
cout << "您目前只是普通用户,需要升级VIP" << endl;
}
virtual void ticketMovie()
{
cout << "您目前没有券,需要购买电影券" << endl;
}
private:
VideoSite* pVideo;
};
// 代理类 代理FixBugVideoSite
class VipVideoSiteProxy : public VideoSite
{
public:
VipVideoSiteProxy() { pVideo = new FixBugVideoSite(); }
~VipVideoSiteProxy() { delete pVideo; }
virtual void freeMovie()
{
pVideo->freeMovie(); // 通过代理对象的freeMovie, 来访问真正委托类对象的freeMoive
}
virtual void vipMovie()
{
pVideo->vipMovie();
}
virtual void ticketMovie()
{
cout << "您目前没有券,需要购买电影券" << endl;
}
private:
VideoSite* pVideo;
};
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(std::move(p1)); // unique_ptr 没有左值引用
watchMovie(std::move(p2)); // 这里要么以引用接收,要么移动语义,调用右值引用
}

1606

被折叠的 条评论
为什么被折叠?



