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

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

比如老板就是委托类,助理就是代理类,由于不是每一个客户都可以面见老板,所以助理要帮助老板筛选那些可以面见老板的客户。又比如一款游戏,游戏的关卡就是委托类,委托类实现了各个关卡的功能,而代理类就是游戏闯关规则,用户必须按照这个规则一步一步闯关,不能跳关。再比如,视频播放平台有许多种类的视频,其中有免费和VIP以及用券的视频,平台就是委托类,而平台的权限管理规则类就是代理类,负责限制不同权限的用户能够享受不同的视频。

cpp 复制代码
#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使用平台的所有功能。

运行结果:

相关推荐
王正南7 分钟前
kali-linux 虚拟机连接安卓模拟器
android·linux·运维·虚拟机连接模拟器·安卓模拟器,linux虚拟机
qq_4337764210 分钟前
【无标题】
开发语言·php
Web极客码10 分钟前
如何在Ubuntu服务器上安装和配置BIND9
服务器·数据库·ubuntu
吳所畏惧27 分钟前
Linux环境/麒麟V10SP3下离线安装Redis、修改默认密码并设置Redis开机自启动
linux·运维·服务器·redis·中间件·架构·ssh
yueguangni39 分钟前
sysstat 版本 10.1.5 是 CentOS 7 的默认版本,默认情况下确实不显示 %wait 字段。需要升级到新版sysstat
linux·运维·centos
会周易的程序员43 分钟前
多模态AI 基于工业级编译技术的PLC数据结构解析与映射工具
数据结构·c++·人工智能·单例模式·信息可视化·架构
Davina_yu1 小时前
Windows 下升级 R 语言至最新版
开发语言·windows·r语言
阿珊和她的猫1 小时前
IIFE:JavaScript 中的立即调用函数表达式
开发语言·javascript·状态模式
listhi5201 小时前
卷积码编码和维特比译码的MATLAB仿真程序
开发语言·matlab
yuan199971 小时前
基于主成分分析(PCA)的故障诊断MATLAB仿真
开发语言·matlab