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

运行结果:

相关推荐
User_芊芊君子6 分钟前
CANN010:PyASC Python编程接口—简化AI算子开发的Python框架
开发语言·人工智能·python
苏渡苇6 分钟前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
小羊不会打字7 分钟前
CANN 生态中的跨框架兼容桥梁:`onnx-adapter` 项目实现无缝模型迁移
c++·深度学习
Max_uuc16 分钟前
【C++ 硬核】打破嵌入式 STL 禁忌:利用 std::pmr 在“栈”上运行 std::vector
开发语言·jvm·c++
故事不长丨17 分钟前
C#线程同步:lock、Monitor、Mutex原理+用法+实战全解析
开发语言·算法·c#
近津薪荼18 分钟前
dfs专题4——二叉树的深搜(验证二叉搜索树)
c++·学习·算法·深度优先
牵牛老人20 分钟前
【Qt 开发后台服务避坑指南:从库存管理系统开发出现的问题来看后台开发常见问题与解决方案】
开发语言·qt·系统架构
小Tomkk23 分钟前
数据库 变更和版本控制管理工具 --Bytebase 安装部署(linux 安装篇)
linux·运维·数据库·ci/cd·bytebase
赌博羊23 分钟前
ImportError: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32‘ not found
linux·运维·gnu
木卫二号Coding25 分钟前
第七十九篇-E5-2680V4+V100-32G+llama-cpp编译运行+Qwen3-Next-80B
linux·llama