代理模式 结构型模式之四

1.概念

代理模式是一种常见的设计模式,它允许你在不直接访问对象的情况下,通过一个代理对象来控制对该对象的访问。这个代理对象可以作为客户端和实际对象之间的中介,从而实现一些特定的控制功能,比如限制访问、记录访问日志等。

怎么理解呢,我们一般来说存在一个实际的对象,这个对象包含了丰富的业务方法,我们当然可以暴露出来给所有人使用。但是有时候我们并不希望这些方法没没有限制的使用,比如某个方法是重启服务器。如果这个方法不加约束的暴露给所有人,那将会是一场灾难。因此这个时候我们需要给这个对象一层保护壳,也就是代理,其它人都需要经过代理来访问它。再举一个例子。好比一个君主,如果随便让别人访问它,万一里面藏着刺客,这个君主随时面临生命危险。所以大家想要给君主传达信息,一般都是通过代理人(大臣)来帮忙传达,这就是代理模式的其中一种应用场景,安全代理。

2.组成结构

  1. 抽象主题(Subject):定义了代理和实际对象之间的共同接口。这个接口通常包含了代理对象需要实现的方法。
  2. 实际主题(Real Subject):定义了代理对象所代表的实际对象。
  3. 代理(Proxy):代理对象实现了抽象主题中的接口,并保存了对实际主题的引用。代理对象可以控制对实际对象的访问,比如限制访问或记录访问日志等。

3.示例代码

cpp 复制代码
#pragma once
#include <string>
#include <iostream>

using namespace std;

//抽象类
class VideoSite
{
public:
	virtual void freeMovie() = 0;  //免费电影
	virtual void vipMovie() = 0;   //vip电影
	virtual void ticketMovie() = 0;//用券电影
};

//具体实现类
class FixBugVideoSite : public VideoSite
{
public:
	virtual void freeMovie()  //免费电影
	{
		cout << "观看免费电影" << endl;
	}
	virtual void vipMovie()   //vip电影
	{
		cout << "观看vip电影" << endl;
	}
	virtual void ticketMovie() //用券电影
	{
		cout << "用券观看电影" << endl;
	}
};

//普通用户代理类
class FreeVideSiteProxy : public VideoSite
{
public:
	FreeVideSiteProxy()
	{
		pVideo = new FixBugVideoSite();
	}
	~FreeVideSiteProxy()
	{
		delete pVideo;
	}
	virtual void freeMovie()  //免费电影
	{
		pVideo->freeMovie(); //通过代理对象的freeMovie,来访问真正委托类对象的freeMovie方法
	}
	virtual void vipMovie()   //vip电影
	{
		cout << "不好意思,您不是VIP,请先充值。" << endl;
	}
	virtual void ticketMovie()//用券电影
	{
		cout << "不好意思,您没有券,请先购买。" << endl;
	}
private:
	FixBugVideoSite* pVideo;
};

//VIP用户代理类
class vipVideSiteProxy : public VideoSite
{
public:
	vipVideSiteProxy()
	{
		pVideo = new FixBugVideoSite();
	}
	~vipVideSiteProxy()
	{
		delete pVideo;
	}
	virtual void freeMovie()  //免费电影
	{
		pVideo->freeMovie(); //通过代理对象的freeMovie,来访问真正委托类对象的freeMovie方法
	}
	virtual void vipMovie()   //vip电影
	{
		pVideo->vipMovie();
	}
	virtual void ticketMovie()//用券电影
	{
		cout << "不好意思,您没有券,请先购买。" << endl;
	}
private:
	VideoSite* pVideo;
};


void main()
{
	unique_ptr<VideoSite> p1(new FreeVideSiteProxy());
	unique_ptr<VideoSite> p2(new vipVideSiteProxy());

	p1->freeMovie();
	p1->vipMovie();
	p1->ticketMovie();

	cout << "--------------------------" << endl;
	p2->freeMovie();
	p2->vipMovie();
	p2->ticketMovie();
}

在上面的例子种,代理就是的作用就是做权限的隔绝。

4.应用场景

  1. 访问控制:代理模式可以用来控制对实际对象的访问权限。比如,只有特定用户或角色才能访问某些敏感数据。
  2. 远程访问:代理模式可以用来处理远程对象的访问。比如,通过代理对象来访问远程Web服务。
  3. 延迟加载:代理模式可以用来实现延迟加载。比如,通过代理对象来加载某些资源或数据,以避免在程序启动时就加载所有数据。
  4. 缓存:代理模式可以用来实现缓存。比如,代理对象可以缓存一些频繁访问的数据或结果,以提高程序的性能。
  5. 远程代理:当需要在不同的进程或机器之间进行通信时,可以使用远程代理来封装和管理通信的过程和数据。
  6. 虚拟代理:当需要延迟加载或预加载大量数据时,可以使用虚拟代理来提高程序的性能和效率。
  7. 安全代理:当需要限制外部对对象的访问权限时,可以使用安全代理来实现访问控制和管理。
  8. 缓存代理:当需要对经常使用的数据进行缓存时,可以使用缓存代理来管理和优化数据的访问效率。
  9. 智能指针代理:当需要对对象进行内存管理和安全释放时,可以使用智能指针代理来管理对象的生命周期。

5.优缺点

优点:

  1. 代理模式可以提供额外的访问控制,从而保证安全性。代理类可以拦截外部请求,并控制对实际对象的访问权限。
  2. 代理模式可以实现对实际对象的延迟加载。例如,在使用代理模式实现图片加载时,可以在实际需要加载图片时才创建实际对象,从而提高程序的性能和效率。
  3. 代理模式可以实现对实际对象的访问管理和优化。例如,在使用代理模式实现数据库连接时,可以通过代理类来管理连接池和连接的使用,从而优化数据库的访问效率。
  4. 代理模式可以实现对实际对象的增强和扩展。例如,在使用代理模式实现日志记录时,可以通过代理类来增强实际对象的功能,从而记录相关的日志信息。

缺点:

  1. 代理模式会增加程序的复杂度和开销。在代理模式中,需要创建额外的代理类,并对代理类和实际对象之间的接口和交互方式进行设计和实现。
  2. 代理模式可能会降低程序的性能和效率。在代理模式中,需要对代理类和实际对象之间的通信进行额外的开销和处理,从而可能会影响程序的性能和效率。

6.引用

深入剖析C++代理模式:优缺点和应用场景一览无余 - 知乎 (zhihu.com)

C++之代理模式_c++代理模式_Flying clouds的博客-CSDN博客

相关推荐
huangyuchi.35 分钟前
【C++11】Lambda表达式
开发语言·c++·笔记·c++11·lambda·lambda表达式·捕捉列表
什么半岛铁盒1 小时前
Linux线程与进程:探秘共享地址空间的并发实现与内
linux·c++
星星点点洲1 小时前
【设计模式区别】装饰器模式和适配器模式区别
设计模式·适配器模式·装饰器模式
智践行1 小时前
ROS2 Jazzy:创建自定义的消息和服务接口(C++)
c++·操作系统
Tang10242 小时前
分析 Android Jetpack Lifecycle 的设计思想及其与生命周期感知组件的交互原理
设计模式
?abc!2 小时前
设计模式基础概念(结构型模式):适配器模式(Adapter Pattern)
python·设计模式·适配器模式
Maple_land2 小时前
C++初阶——string的模拟实现(上)
c++
今晚打老虎2 小时前
c++弹窗
开发语言·c++
虾球xz2 小时前
游戏引擎学习第240天:将渲染器移至第三层
c++·学习·游戏引擎
ApeAssistant3 小时前
Spring + 设计模式 (十八) 行为型 - 责任链模式
spring·设计模式