代理模式
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