您的位置:首页 > 健康 > 养生 > C++设计模式2:代理模式

C++设计模式2:代理模式

2024/10/5 20:25:24 来源:https://blog.csdn.net/weixin_74027669/article/details/141463557  浏览:    关键词:C++设计模式2:代理模式

实际上,代理模式就是委托类通过代理类来控制实际对象的访问权限。

        比如老板就是委托类,助理就是代理类,由于不是每一个客户都可以面见老板,所以助理要帮助老板筛选那些可以面见老板的客户。又比如一款游戏,游戏的关卡就是委托类,委托类实现了各个关卡的功能,而代理类就是游戏闯关规则,用户必须按照这个规则一步一步闯关,不能跳关。再比如,视频播放平台有许多种类的视频,其中有免费和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使用平台的所有功能。 

        运行结果:

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com