实际上,代理模式就是委托类通过代理类来控制实际对象的访问权限。
比如老板就是委托类,助理就是代理类,由于不是每一个客户都可以面见老板,所以助理要帮助老板筛选那些可以面见老板的客户。又比如一款游戏,游戏的关卡就是委托类,委托类实现了各个关卡的功能,而代理类就是游戏闯关规则,用户必须按照这个规则一步一步闯关,不能跳关。再比如,视频播放平台有许多种类的视频,其中有免费和VIP以及用券的视频,平台就是委托类,而平台的权限管理规则类就是代理类,负责限制不同权限的用户能够享受不同的视频。
#include<iostream>
using namespace std;
//抽象类
class VideoSite
{
public:
VideoSite() {}
~VideoSite() {}
virtual void freevideo()=0;
virtual void vipvideo()=0;
virtual void ticketvideo()=0;
};
//委托类
class RealVideoSite:public VideoSite
{
public:
RealVideoSite() {}
~RealVideoSite() {}
//将功能函数封装起来,不让用户访问,只能通过代理类来访问
private:
void freevideo()
{
std::cout << "请享受免费视频" << std::endl;
}
void vipvideo()
{
std::cout << "请享受vip视频" << std::endl;
}
void ticketvideo()
{
std::cout << "请享受用券视频" << std::endl;
}
};
//代理类
class FreeVideoSite :public VideoSite
{
public:
FreeVideoSite()
{
site = new RealVideoSite();
}
~FreeVideoSite() {}
void freevideo()
{
site->freevideo();
}
void vipvideo()
{
std::cout << "普通用户不能观看vip视频" << std::endl;
}
void ticketvideo()
{
std::cout << "请购买视频券" << std::endl;
}
private:
VideoSite* site;
};
class VipVideoSite :public VideoSite
{
public:
VipVideoSite()
{
site = new RealVideoSite();
}
~VipVideoSite() {}
void freevideo()
{
site->freevideo();
}
void vipvideo()
{
site->vipvideo();
}
void ticketvideo()
{
std::cout << "请购买视频券" << std::endl;
}
private:
VideoSite* site;
};
class TicketVideoSite :public VideoSite
{
public:
TicketVideoSite()
{
site = new RealVideoSite();
}
~TicketVideoSite() {}
void freevideo()
{
site->freevideo();
}
void vipvideo()
{
site->vipvideo();
}
void ticketvideo()
{
site->ticketvideo();
}
private:
VideoSite* site;
};
//委托类希望提供的公共API,供用户通过代理类使用平台的功能
void watchvideo(VideoSite * site)
{
site->freevideo();
site->vipvideo();
site->ticketvideo();
}
int main()
{
std::cout << "普通用户" << std::endl;
watchvideo(new FreeVideoSite());
std::cout << "Vip用户" << std::endl;
watchvideo(new VipVideoSite());
std::cout << "买券用户" << std::endl;
watchvideo(new TicketVideoSite());
return 0;
}
三个代理类各自实现自己代理的功能,从而限制用户对功能的使用,只有有对应权限的用户,才能直接使用RealVideoSite(委托类)的功能。RealVideoSite的所有功能函数都要声明为private的,只有构造和析构函数是public的,这样可以避免直接使用RealVideoSite使用平台的所有功能。
运行结果: