当前位置: 首页 > news >正文

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使用平台的所有功能。 

        运行结果:


http://www.mrgr.cn/news/14116.html

相关文章:

  • HashMap动态扩容解析
  • 在vue3中封装WebSocket
  • 【Kubernetes】k8s集群之HPA
  • 视频结构化从入门到精通——认识视频结构化
  • Tiptap中BubbleMenu讲解
  • 虚拟内存管理和保护模式
  • SpringBoot配置多个kafka配置
  • 神经网络——CIFAR10小实战
  • RabbitMQ 常见问题与故障排查
  • 奇门WMS-A和金蝶云星空单据接口对接
  • 程序设计训练3.16最大报销额
  • 主机休眠之后 Ubuntu 虚拟机无网络
  • 【有道云-注册安全分析报告】
  • 小程序面试题一
  • 彩色相机拍照,图片时亮时暗
  • 悬浮翻译软件有哪些?试试这些利器
  • 独立站除了Shopify还有什么?
  • 数据库:头歌实验二数据库安全性技术
  • 【网络安全】服务基础第一阶段——第六节:Windows系统管理基础---- DNS部署与安全
  • 从算法到硬件实现:《基于FPGA的数字信号处理》(可下载)