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

运行结果:

相关推荐
TIF星空1 小时前
【使用 C# 获取 USB 设备信息及进行通信】
开发语言·经验分享·笔记·学习·microsoft·c#
zm2 小时前
TCP 粘包
服务器·网络·php
Smile丶凉轩3 小时前
Qt 界面优化(绘图)
开发语言·数据库·c++·qt
reasonsummer3 小时前
【办公类-100-01】20250515手机导出教学照片,自动上传csdn+最大化、最小化Vs界面
开发语言·python
C_Liu_4 小时前
C语言:深入理解指针(5)
java·c语言·算法
small_wh1te_coder4 小时前
从经典力扣题发掘DFS与记忆化搜索的本质 -从矩阵最长递增路径入手 一步步探究dfs思维优化与编程深度思考
c语言·数据结构·c++·stm32·算法·leetcode·深度优先
苏三福5 小时前
ros2 hunmle bag 数据包转为图片数据 python版
开发语言·python·ros2humble
honey ball5 小时前
R & S的EMI接收机面板
linux·运维·网络
qqxhb6 小时前
零基础学Java——第十一章:实战项目 - 桌面应用开发(JavaFX入门)
java·开发语言·javafx
大神薯条老师6 小时前
Python零基础入门到高手8.4节: 元组与列表的区别
开发语言·爬虫·python·深度学习·机器学习·数据分析