代理模式

1 核心思想

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

代理模式
Subject类,定义了RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy代替;

RealSubject类,定义Proxy所代表的真实实体;

Proxy类,保存一个引用使得代理可以访问实体,并提供一个与Subject的接口相同的接口,这样代理就可以用来代替实体。

//Subject.h
#include<iostream>

class Subject
{

public:
	Subject() {

	}

	virtual ~Subject() {

	}

	virtual void Request() =0;

};

//Client.h
#include "Subject.h"

class Client
{

public:
	Client(std::string name);
	virtual ~Client();
	Subject *m_Subject;

	std::string m_strName;
};

//Proxy.h
#include "Subject.h"
#include "RealSubject.h"

class Proxy : public Subject
{

public:
	Proxy(Client* client,std::string nameProxy, std::string nameRealSubject);
	virtual ~Proxy();
	RealSubject *m_RealSubject;

	virtual void Request();

	std::string m_strProxyName;

};

//RealSubject.h
#include "Subject.h"
#include "Client.h"

class RealSubject : public Subject
{

public:
	RealSubject(std::string nameRealSubject, Client* client);
	virtual ~RealSubject();

	virtual void Request();

private:
	Client* m_client;
	std::string m_strRealSubject;
};
//Client.cpp
#include "Client.h"


Client::Client(std::string name){
	m_strName = name;
}



Client::~Client(){

}

//Proxy.cpp
#include "Proxy.h"

Proxy::Proxy(Client* client, std::string nameProxy, std::string nameRealSubject){
	m_strProxyName = nameProxy;
	m_RealSubject = new RealSubject(nameRealSubject, client);
}

Proxy::~Proxy(){

}

void Proxy::Request(){
	if (m_RealSubject)
	{
		std::cout << ("我是 " + m_strProxyName + ",代替 ").c_str();
		m_RealSubject->Request();
	}
	
}

//RealSubject.cpp
#include "RealSubject.h"

RealSubject::RealSubject(std::string nameRealSubject, Client* client){
	m_strRealSubject = nameRealSubject;
	m_client = client;
}

RealSubject::~RealSubject(){

}

void RealSubject::Request(){
	std::cout << (m_strRealSubject + " 说:").c_str();
	std::cout << m_client->m_strName.c_str() << ",送你鲜花" << std::endl;
}
//main.cpp
#include "Client.h"
#include "Proxy.h"

int main()
{
	Client* client = new Client("李美美");

	Proxy* proxy = new Proxy(client,"戴励","卓贾易");
	proxy->Request();

	return 0;
}

代理模式

2 代理模式应用

代理模式应用场合:

  • 远程代理,为一个对象在不同的地址空间提供局部代表,这样就可以隐藏一个对象存在于不同地址空间的事实;
  • 虚拟代理,根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象;浏览器中是用代理模式来优化下载的;
  • 安全代理,用来控制真实对象访问时的权限,用于对象应该有不同的访问权限的时候;
  • 智能指引,是指当调用真实的对象时,代理处理另外一些事,比如引用计数第一次访问一个持久对象时将其装入内存访问一个对象前,检查是否已被锁定

代理模式实现引用计数:
著名的代理模式例子为引用计数(英语:reference counting)指针对象。

当一个复杂对象的多份副本须存在时,代理模式可以结合享元模式以减少存储器用量。典型作法是创建一个复杂对象及多个代理者,每个代理者会引用到原本的复杂对象。而作用在代理者的运算会转送到原本对象。一旦所有的代理者都不存在时,复杂对象会被移除。

3 推荐学习

https://blog.****.net/lovelion/article/details/8227953
https://blog.****.net/lovelion/article/details/8228042 代理类还可以有新增功能
https://blog.****.net/lovelion/article/details/8228132
https://blog.****.net/lovelion/article/details/8228156