1、代理模式的提出
在組件的開發(fā)過程中,有些對象由于某種原因(比如對象創(chuàng)建的開銷很大,或者對象的一些操作需要做安全控制,或者需要進程外的訪問等),會使Client使用者在操作這類對象時可能會存在問題:(1)使用者直接訪問這種對象會使系統(tǒng)帶來很多麻煩。(2)或者使用者使不能直接訪問這類對象;使用代理模式就可以解決此類問題。代理模式是在實際操作類和Client使用者之間增加一個代理類,實際操作類的一些操作,比如對象創(chuàng)建、接口訪問、安全控制等相關操作都可以在增加的代理類里面添加相關的功能代碼。這樣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()
{
//創(chuàng)建代理對象
Proxy proxy;
//通過代理對象來訪問實際對象的接口
proxy.request();
proxy.dataTransfer();
}
};
int main()
{
Client obj;
obj.DoWork();
return 0;
}
運行結果如下:
4、代理模式缺點
系統(tǒng)中類數量增加;由于增加代理類,訪問實際類的速度會在某種程度上降低。增加系統(tǒng)復雜度。
5、代理模式優(yōu)點
可以訪問不能訪問的對象;降低系統(tǒng)直接的耦合度,便于功能擴展。
關于代理模式的介紹也可參考:文章來源:http://www.zghlxwxcb.cn/news/detail-664687.html
設計模式之代理模式(C++實現)_墨1024的博客-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-664687.html
到了這里,關于設計模式之代理模式(Proxy)的C++實現的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!