代理模式——C++实现

news/2025/2/3 15:17:36 标签: 代理模式, c++, 开发语言

目录

1. 代理模式简介

2. 代码示例


1. 代理模式简介

代理模式是一种行为型模式

代理模式的定义:由于某些原因需要给某对象提供一个代理以控制该对象的访问。这时,访问对象不适合或者不能直接访问引用目标对象,代理对象作为访问对象和目标对象之间的中介,代理模式也叫做委托模式。


代理模式实际上作为一个中间层,处于要操作的目标对象和客户代码之间的中间层。相当于一个中介。

代理模式涉及到的角色主要有三个:

  1. 抽象主题(抽象接口类):通过接口类声明真实主题的业务接口。
  2. 真实主题(业务实现类):实现了具体的业务,是代理对象所引用的真实对象。
  3. 代理类:提供了和真实主题相同的接口,并引用了一个真实主题对象,可以调用具体的业务接口,访问真实主题的功能。

UML类图如下所示:


以租房为例,房屋中介就相当于代理对象,房东就相当于真实主题。客户只需要和中介打交道即可。

代理对象并不真正实现服务,而是通过调用引用的真实对象的相应接口来提供服务,真正的业务还是由真实主题来完成。

代理对象的目的在于执行具体业务的前后加入一些其他的操作,比如权限控制、缓存、日志记录等功能。

这样真实的业务类就可以专注于业务的实现,其他的限制操作在代理类中实现。

代理模式的关键就在于代理类和真实主题类继承自相同的接口,并且代理模式引用一个真实的主题对象。

2. 代码示例

这里我们模拟一个计算器的程序,代理类将限制计算器的使用次数,超过使用次数上限将限制访问。

#if 1

#include <iostream>

using namespace std;

class Subject
{
public:
	virtual int add(int a, int b) = 0;
	virtual int sub(int a, int b) = 0;
};

class RealSubject : public Subject
{
public:
	int add(int a, int b)
	{
		return a + b;
	}

	int sub(int a, int b)
	{
		return a - b;
	}
};

class Proxy : public Subject
{
private:
	RealSubject* m_realSubject;
	unsigned int m_count;
public:
	Proxy(RealSubject* realSubject, unsigned int count = 3)
	{
		m_realSubject = realSubject;
		m_count = count;
	}

	int add(int a, int b)
	{
		if (m_count == 0)
		{
			cout << "剩余访问次数为0,无法访问" << endl;
			return 0;
		}
		else
		{
			m_count--;
			cout << "剩余访问次数:" << m_count << endl;
			return m_realSubject->add(a, b);
		}
	}

	int sub(int a, int b)
	{
		if (m_count == 0)
		{
			cout << "剩余访问次数为0,无法访问" << endl;
			return 0;
		}
		else
		{
			m_count--;
			cout << "剩余访问次数:" << m_count << endl;
			return m_realSubject->sub(a, b);
		}
	}

};

int main()
{
	RealSubject realSubject;
	Proxy proxy(&realSubject);

	cout << proxy.add(10, 5) << endl;
	cout << proxy.sub(10, 5) << endl;
	cout << proxy.add(10, 5) << endl;
	cout << proxy.sub(10, 5) << endl;
	cout << proxy.add(10, 5) << endl;

	return 0;
}

#endif

运行结果如下图所示:

 


http://www.niftyadmin.cn/n/5840891.html

相关文章

【Proteus】NE555纯硬件实现LED呼吸灯效果,附源文件,效果展示

本文通过NE555定时器芯片和简单的电容充放电电路,设计了一种纯硬件实现的呼吸灯方案,并借助Proteus仿真软件验证其功能。方案无需编程,成本低且易于实现,适合电子爱好者学习PWM(脉宽调制)和定时器电路原理。 一、呼吸灯原理与NE555功能分析 1. 呼吸灯核心原理 呼吸灯的…

Linux网络 HTTPS 协议原理

概念 HTTPS 也是一个应用层协议&#xff0c;不过 是在 HTTP 协议的基础上引入了一个加密层。因为 HTTP的内容是明文传输的&#xff0c;明文数据会经过路由器、wifi 热点、通信服务运营商、代理服务器等多个物理节点&#xff0c;如果信息在传输过程中被劫持&#xff0c;传输的…

Kafka流式计算架构

引言 Kafka 凭借其卓越的架构设计&#xff0c;具备极为高效的流式计算能力&#xff0c;在海量数据环境下&#xff0c;依然能够以惊人的速度实现消息的高性能消费&#xff0c;轻松应对高并发、低延迟的严苛业务需求。无论是实时数据处理、复杂事件分析&#xff0c;还是大规模数…

在亚马逊云科技上用Stable Diffusion 3.5 Large生成赛博朋克风图片(上)

背景介绍 在2024年的亚马逊云科技re:Invent大会上提前预告的Stable Diffusion 3.5 Large&#xff0c;现在已经在Amazon Bedrock上线了&#xff01;各位开发者们现在可以使用该模型&#xff0c;根据文本提示词文生图生成高质量的图片&#xff0c;并且支持多种图片风格生成&…

Java synchronized的实现原理?

大家好&#xff0c;我是锋哥。今天分享关于【Java synchronized的实现原理?】面试题。希望对大家有帮助&#xff1b; Java synchronized的实现原理? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Java 中的 synchronized 关键字用于实现同步控制&#xff0c;确保…

Java基础知识总结(三十九)--File类

将文件系统中的文件和文件夹封装成了对象。提供了更多的属性和行为可以对这些文件和文件夹进行操作。这些是流对象办不到的&#xff0c;因为流只操作数据。 File类常见方法&#xff1a; 1&#xff1a;创建。 boolean createNewFile()&#xff1a;在指定目录下创建文件&#x…

[paddle] 矩阵相关的指标

行列式 det 行列式定义参考 d e t ( A ) ∑ i 1 , i 2 , ⋯ , i n ( − 1 ) σ ( i 1 , ⋯ , i n ) a 1 , i 1 a 2 , i 2 , ⋯ , a n , i n det(A) \sum_{i_1,i_2,\cdots,i_n } (-1)^{\sigma(i_1,\cdots,i_n)} a_{1,i_1}a_{2,i_2},\cdots, a_{n,i_n} det(A)i1​,i2​,⋯,in​…

V103开发笔记1-20250113

2025-01-13 一、应用方向分析 应用项目&#xff1a; PCBFLY无人机项目&#xff08;包括飞控和手持遥控器&#xff09;&#xff1b; 分析移植项目&#xff0c;应用外设资源包括&#xff1a; GPIO, PWM,USART,GPIO模拟I2C/SPI, ADC,DMA,USB等&#xff1b; 二、移植项目的基本…