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

运行结果:

相关推荐
DougLiang32 分钟前
关于easyexcel动态下拉选问题处理
java·开发语言
mochensage40 分钟前
CSP信奥赛C++常用系统函数汇总
c++·信奥
mochensage41 分钟前
C++信息学竞赛中常用函数的一般用法
java·c++·算法
fpcc1 小时前
跟我学c++中级篇——多线程中的文件处理
c++
全职计算机毕业设计1 小时前
基于Java Web的校园失物招领平台设计与实现
java·开发语言·前端
地衣君1 小时前
RISC-V 开发板 + Ubuntu 23.04 部署 open_vins 过程
linux·ubuntu·risc-v
5:002 小时前
云备份项目
linux·开发语言·c++
码农101号2 小时前
Linux中shell编程表达式和数组讲解
linux·运维·服务器
笨笨马甲2 小时前
Qt Quick模块功能及架构
开发语言·qt
乄夜2 小时前
嵌入式面试高频(5)!!!C++语言(嵌入式八股文,嵌入式面经)
c语言·c++·单片机·嵌入式硬件·物联网·面试·职场和发展