1、代理模式的提出
在组件的开发过程中,有些对象由于某种原因(比如对象创建的开销很大,或者对象的一些操作需要做安全控制,或者需要进程外的访问等),会使Client使用者在操作这类对象时可能会存在问题:(1)使用者直接访问这种对象会使系统带来很多麻烦。(2)或者使用者使不能直接访问这类对象;使用代理模式就可以解决此类问题。代理模式是在实际操作类和Client使用者之间增加一个代理类,实际操作类的一些操作,比如对象创建、接口访问、安全控制等相关操作都可以在增加的代理类里面添加相关的功能代码。这样Client实际上是通过代理类来访问和操作实际类。
2、需求描述
有一个主题类,该类具有请求功能和数据转换功能。而Client使用者不能直接访问和操作它,只能间接的通过其它类进行访问操作。
3、代理模式的代码实现
(1)代码UML图如下:
(2)代码实现如下:
#include <iostream>
class AbsSubject
{
public:
virtual void request()=0;
virtual void dataTransfer()=0;
virtual ~AbsSubject(){};
};
class RealSubject:public AbsSubject
{
public:
virtual void request() override
{
std::cout << "RealSubject request" << std::endl;
};
virtual void dataTransfer() override
{
std::cout << "RealSubject dataTransfer" << std::endl;
}
};
class Proxy:public AbsSubject
{
private:
RealSubject* realSubject{nullptr};
public:
Proxy()
{
realSubject = new RealSubject();
};
virtual void request() override
{
if(nullptr == realSubject)
{
return;
}
std::cout << "Proxy request" << std::endl;
realSubject->request();
};
virtual void dataTransfer()override
{
if(nullptr == realSubject)
{
return;
}
std::cout << "Proxy dataTransfer" << std::endl;
realSubject->dataTransfer();
};
virtual ~Proxy()
{
std::cout << " ~Proxy" << std::endl;
if(nullptr != realSubject)
{
delete realSubject;
realSubject = nullptr;
}
}
};
class Client
{
public:
void DoWork()
{
//创建代理对象
Proxy proxy;
//通过代理对象来访问实际对象的接口
proxy.request();
proxy.dataTransfer();
}
};
int main()
{
Client obj;
obj.DoWork();
return 0;
}
运行结果如下:
4、代理模式缺点
系统中类数量增加;由于增加代理类,访问实际类的速度会在某种程度上降低。增加系统复杂度。
5、代理模式优点
可以访问不能访问的对象;降低系统直接的耦合度,便于功能扩展。
关于代理模式的介绍也可参考:
设计模式之代理模式(C++实现)_墨1024的博客-CSDN博客