结构型模式-代理模式

代理模式的理论

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

举例:

比如这里面服务器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)客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性。

缺点:

代理实现较为复杂。

代理模式的适用场景

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

相关推荐
sxlishaobin4 分钟前
Maven Setting详解
java·学习·maven
每月一号准时摆烂32 分钟前
服务器运维笔记(一)——使用shell编写实时查看BMC功率的脚本
运维·服务器·笔记
xiaoye-duck4 小时前
《C++ 项目:手写大模型接入 SDK》DataManager数据管理模块:SQLite持久化存储
开发语言·数据库·c++·sqlite
是main不是漫5 小时前
【C++——类和对象(上)】筑基篇:以封装奠定面向对象之基
c语言·开发语言·c++
小七在进步15 小时前
string的使用(1)
c++·visual studio
白杨尚青16 小时前
C++进阶篇(六):map 和 set 的模拟实现——用红黑树封装 mymap/myset(迭代器 + operator[])
开发语言·c++·迭代器·stl·set·map·红黑树
kloc19 小时前
聊天室项目入口网关子服务的实现
linux·c++
柳鲲鹏20 小时前
内斗学概论:43、平级内斗
笔记
csdn_aspnet1 天前
C++ 3个有序点的方向(Orientation of 3 ordered points)
c++·算法
星恒随风1 天前
MySQL 从零入门(四):表的增删改查与基础查询详解
linux·服务器·数据库·笔记·mysql