当前位置: 首页 > article >正文

代理模式——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.kler.cn/a/529775.html

相关文章:

  • JavaScript面向对象编程:Prototype与Class的对比详解
  • udp和tcp的区别
  • 2025 年,链上固定收益领域迈向新时代
  • 爬虫基础(六)代理简述
  • C#面试常考随笔7:什么是匿名⽅法?还有Lambda表达式?
  • 单链表专题(中)
  • MVC 文件夹:架构之美与实际应用
  • 从零开始:用Qt开发一个功能强大的文本编辑器——WPS项目全解析
  • 在K8S中,pending状态一般由什么原因导致的?
  • 苹果CMSV10仿茶杯狐自适应视频模板源码 PC+WAP自适应视频模板
  • 【Qt】界面优化
  • day37|完全背包基础+leetcode 518.零钱兑换II ,377.组合总和II
  • 记录 | 基于MaxKB的仿小红书旅游文章AI制作(含图文、视频)
  • 边缘检测算法(sobel)
  • redis集群理论详解
  • 安卓pad仿写element-ui表单验证
  • 关于合并两个有序链表
  • STM32CUBEIDE编译的hex使用flymcu下载后不能运行
  • Ubuntu 22.04系统安装部署Kubernetes v1.29.13集群
  • JavaScript系列(54)--性能优化技术详解
  • c语言(关键字)
  • Android 13 取色引擎详解
  • 每日 Java 面试题分享【第 19 天】
  • 微信小程序问题1 skyline模式渲染webview模式
  • Labelme转Voc、Coco
  • LeetCode 2909. 元素和最小的山形三元组 II