结构型模式-代理模式

代理模式的理论

代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

举例:

比如这里面服务器B的test可能还没写好,A访问不了,先访问代理类,写好了代替再代替访问

代理模式的案例

传统方法局限:是个人都能调用

cpp 复制代码
#include <iostream>
using namespace std;


//提供一种代理来控制对其他对象的访问

class AbstraactCommonInterface {
public:
	virtual void run() = 0;

};

//我已经写好的系统
class Mysystem {
public:
	virtual void run() {
		cout << "系统启动..." << endl;
	}
};

//必须有权限验证,不是所有人都能来启动我的启动,必须提供用户名和密码



int main() {
	//这样不行。是个人都能启动
	Mysystem* system = new Mysystem;
	system -> run();

	return 0;
}

代理模式

优点:必须有权限验证,不是所有人都能来启动我的启动,必须提供用户名和密码

cpp 复制代码
#include <iostream>
using namespace std;

//提供一种代理来控制对其他对象的访问
class AbstraactCommonInterface {
public:
	virtual void run() = 0;

};

//我已经写好的系统
class Mysystem :public AbstraactCommonInterface{
public:
	virtual void run() {
		cout << "系统启动..." << endl;
	}
};

//必须有权限验证,不是所有人都能来启动我的启动,必须提供用户名和密码
class MysystemProxy :public AbstraactCommonInterface {
public:
	MysystemProxy(string username,string password) {
		this->mUsername = username;
		this->mPassword = mPassword;
		
	}
	bool checkUsernameAndPassword() {
		if (mUsername == "admin"&&mPassword == "admin") {
			return true;
		}
		return false;
	}
	virtual void run() {
		if (checkUsernameAndPassword()) {
			cout << "用户名和密码正确,验证通过..." << endl;
			this->pSystem->run();
		}
		else {
			cout << "用户名或密码错误,权限不足...." << endl;
		}
	}
	~MysystemProxy() {
		if (pSystem != NULL) {
			delete pSystem;
		}
	}
public:
	Mysystem* pSystem;
	string mUsername;
	string mPassword;
};

void test01() {
	MysystemProxy* proxy = new MysystemProxy("root","admin");
	proxy->run();
}


int main() {
#if 0
	//这样不行。是个人都能启动
	Mysystem* system = new Mysystem;
	system -> run();
#endif
	//调用代理模式
	test01();
	return 0;
}

代理模式的举例

(1)上外网

(2)缓冲服务器

代理模式的优缺点

优点:

(1)能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。

(2)客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性。

缺点:

代理实现较为复杂。

代理模式的适用场景

为其他对象提供一种代理以控制对这个对象的访问。

相关推荐
世人万千丶10 分钟前
鸿蒙Flutter TextStyle样式配置
学习·flutter·harmonyos·鸿蒙
吃着火锅x唱着歌35 分钟前
Effective C++ 学习笔记 条款37 绝不重新定义继承而来的缺省参数值
c++·笔记·学习
2401_8414956435 分钟前
【数据结构】B+树
数据结构·数据库·c++·b+树·概念·结构·操作原理
小保CPP42 分钟前
OCR C++ Tesseract按行识别字符
c++·人工智能·ocr·模式识别·光学字符识别
风曦Kisaki1 小时前
# Linux笔记:操作系统优化与资源管理
linux·运维·服务器·笔记
小弥儿1 小时前
GitHub今日热榜 | 2026-07-19
人工智能·学习·github·知识图谱
阿米亚波2 小时前
【C++】流式数据输入处理(不完全整理)
开发语言·c++·笔记
皓月斯语3 小时前
【C++基础】三目运算符
开发语言·数据结构·c++
zhangrelay3 小时前
笔记本轻量高品质延寿工具完整分系统清单
运维·笔记·学习
巴巴媛6663 小时前
STM32学习笔记【38.DHT11实验】
笔记·stm32·学习