系列文章目錄
C++技能系列
Linux通信架構(gòu)系列
C++高性能優(yōu)化編程系列
深入理解軟件架構(gòu)設(shè)計(jì)系列
高級(jí)C++并發(fā)線程編程
設(shè)計(jì)模式系列
期待你的關(guān)注哦!??!
現(xiàn)在的一切都是為將來(lái)的夢(mèng)想編織翅膀,讓夢(mèng)想在現(xiàn)實(shí)中展翅高飛。
Now everything is for the future of dream weaving wings, let the dream fly in reality.
一、代理模式介紹
?? 意圖:
在不改變?cè)碱悾ɑ蚍Q為被代理類)的情況下,通過(guò)引入代理類來(lái)給原始類附加不相關(guān)的其他功能。為其他對(duì)象提供一種代理控制對(duì)這個(gè)對(duì)象的訪問(wèn)。
?? 主要解決:
在直接訪問(wèn)對(duì)象時(shí)帶來(lái)的問(wèn)題,比如說(shuō):要訪問(wèn)的對(duì)象在遠(yuǎn)程的機(jī)器上。在面向?qū)ο笙到y(tǒng)中,有些對(duì)象由于某些原因(比如對(duì)象創(chuàng)建開銷很大,或者某些操作需要安全控制,或者需要進(jìn)程外的訪問(wèn)),直接訪問(wèn)會(huì)給使用者或者系統(tǒng)結(jié)構(gòu)帶來(lái)很多麻煩,我們可以在訪問(wèn)此對(duì)象時(shí)加上一個(gè)對(duì)此對(duì)象的訪問(wèn)層。
?? 何時(shí)使用:
想在訪問(wèn)一個(gè)類時(shí)做一些控制。
?? 如何解決:
增加中間層。
代理模式本質(zhì)是在訪問(wèn)對(duì)象的時(shí)候引入了一定程度的間接性,由于間接性訪問(wèn)對(duì)象,可以附加多種用途。
二、代理模式優(yōu)缺點(diǎn)
2.1 優(yōu)點(diǎn)
-
代理模式能夠協(xié)調(diào)調(diào)用者和被調(diào)用者,在一定程度上降低了系統(tǒng)的耦合度。
-
職責(zé)清晰。實(shí)現(xiàn)好內(nèi)部結(jié)構(gòu)就可以,具體客戶要求由代理進(jìn)行分化。
-
高擴(kuò)展性。具體主題角色隨時(shí)變化,只要實(shí)現(xiàn)了接口,無(wú)論如何都逃不出代理的手掌,所以代理無(wú)論如何都是可以使用的。
-
遠(yuǎn)程代理使得客戶端可以訪問(wèn)在遠(yuǎn)程機(jī)器上的對(duì)象,遠(yuǎn)程機(jī)器可能具有更好的計(jì)算性能與處理速度,可以快速響應(yīng)并處理客戶端請(qǐng)求。
-
虛擬代理通過(guò)使用一個(gè)小對(duì)象來(lái)代表一個(gè)大對(duì)象,可以減少系統(tǒng)資源的消耗,對(duì)系統(tǒng)進(jìn)行優(yōu)化并提高運(yùn)行速度。
-
保護(hù)代理可以控制對(duì)真實(shí)對(duì)象的使用權(quán)限。
2.2 缺點(diǎn)
-
由于在客戶端和真實(shí)主題之間增加了代理對(duì)象,因此有些類型的代理模式可能會(huì)造成請(qǐng)求的處理速度變慢。
-
實(shí)現(xiàn)代理模式需要額外的工作,有些代理模式的實(shí)現(xiàn)非常復(fù)雜。
三、代理模式使用場(chǎng)景
-
遠(yuǎn)程代理:為一個(gè)對(duì)象在不同的地址空間提供局部代表,可以隱藏一個(gè)對(duì)象存在于不同地址空間的事實(shí)。
-
虛擬代理:根據(jù)需要?jiǎng)?chuàng)建開銷很大的對(duì)象。通過(guò)虛擬代理來(lái)存放實(shí)例化需要很長(zhǎng)時(shí)間的真實(shí)對(duì)象。例如:圖片加載的時(shí)候。
-
安全代理:用來(lái)控制真是對(duì)象訪問(wèn)時(shí)的權(quán)限。
-
智能指引:當(dāng)調(diào)用真實(shí)的對(duì)象的時(shí)候,代理處理另外一些事。
如果用戶不能直接訪問(wèn)真實(shí)角色,只能訪問(wèn)代理,則需要讓代理自動(dòng)生成一個(gè)真實(shí)角色對(duì)象。
適配器模式中適配器為所適配的對(duì)象提供了一個(gè)不同的接口,代理模式中代理提供的接口與實(shí)體的接口相同。裝飾模式的目的是為對(duì)象添加功能,而代理模式則控制對(duì)對(duì)象的訪問(wèn)。
四、代理模式實(shí)現(xiàn)
Subject抽象類:
#ifndef SUBJECT_H
#define SUBJECT_H
#include <iostream>
using namespace std;
//定義了Proxy和ConcreteSubject的公有接口
class Subject
{
public:
virtual ~Subject(){}
virtual void request() = 0;
protected:
Subject(){}
};
#endif // SUBJECT_H
ConcreteSubject真實(shí)主題類:
#ifndef CONCRETESUBJECT_H
#define CONCRETESUBJECT_H
#include "Subject.h"
//定義真實(shí)主題類
class ConcreteSubject : public Subject
{
public:
ConcreteSubject(){}
~ConcreteSubject(){}
void request()
{
cout << "ConcreteSubject::request" << endl;
}
};
#endif // CONCRETESUBJECT_H
Proxy代理類:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-604473.html
#ifndef PROXY_H
#define PROXY_H
#include "Subject.h"
#include "ConcreteSubject.h"
//定義代理類
class Proxy : public Subject
{
public:
Proxy():m_pSubject(NULL){}
~Proxy()
{
delete m_pSubject;
m_pSubject = NULL;
}
void request()
{
if(NULL == m_pSubject)
{
m_pSubject = new ConcreteSubject();
}
//額外操作
doSomethingA();
//代理實(shí)體的操作
m_pSubject->request();
//額外操作
doSomethingB();
}
void doSomethingA()
{
cout << "Proxy::doSomethingA" << endl;
}
void doSomethingB()
{
cout << "Proxy::doSomethingB" << endl;
}
private:
Subject* m_pSubject;
};
#endif // PROXY_H
客戶調(diào)用程序:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-604473.html
#include "Proxy.h"
int main()
{
//使用代理取代ConcreteSubject
Proxy* proxy = new Proxy();
proxy->request();
delete proxy;
return 0;
}
到了這里,關(guān)于結(jié)構(gòu)型設(shè)計(jì)模式之代理模式【設(shè)計(jì)模式系列】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!