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

运行结果:

相关推荐
SomeB1oody14 小时前
【RustyML入门】5.2. 分类指标
开发语言·后端·机器学习·rust·教程
左手厨刀右手茼蒿14 小时前
数据仓库的架构演进:从MySQL到ClickHouse到数据湖的工程化实践
linux·嵌入式·系统内核
左手厨刀右手茼蒿14 小时前
创业团队技术选型:别用大厂架构解决小团队问题
linux·嵌入式·系统内核
ZJU_统一阿萨姆14 小时前
【推理优化进阶】图编译与运行时:动态形状、CUDA Graph 与内存规划
开发语言·人工智能·语言模型·架构·开源
@呱呱爱学习14 小时前
C++大成之路_ STL容器_ Vector
开发语言·c++
额额额对了14 小时前
数据结构:二叉树
c语言·数据结构·算法
明志数科14 小时前
宇树科技IPO背后的产业逻辑:人形机器人从“讲故事“到“交数据“
运维·服务器·数据库
码匠许师傅14 小时前
【C++ 面试真题】19. 聊聊 C++ 的迭代器
开发语言·c++·面试
AI情绪识别开源15 小时前
检信ALLEMOTION VibrationAI 2.4.0 12维度情绪识别开源源代码
开发语言·python
Dovis(誓平步青云)15 小时前
DevEco Studio 6.1.1 Windows 安装实录:从下载校验到首次启动
android·开发语言·数据库·人工智能·windows·harmonyos