概述
編寫(xiě)基于另外一組類(lèi)的包裝器接口,結(jié)構(gòu)化設(shè)計(jì)模式可以處理接口包裝任務(wù)现诀。按照包裝器層和原始接口的差異遞增程度劃分夷磕,它們以此是:代理、適配器和外觀仔沿。
<1>代理模式
代理類(lèi)和原始類(lèi)擁有同樣的接口坐桩,可以認(rèn)為是一個(gè)單一組件包裝器,
實(shí)現(xiàn)方式:代理類(lèi) 存儲(chǔ) 原始類(lèi)的副本封锉,但更可能是指向原始類(lèi)的指針绵跷,然后代理類(lèi)中的方法將重定向到原始類(lèi)對(duì)象中的同名方法,
注意:將賦值構(gòu)造函數(shù)和賦值操作函符聲明為私有成員是為了阻止客戶(hù)復(fù)制此對(duì)象
微信截圖_20190402160855.png
class Proxy {
public :
Proxy() : mOrig(new Original()) {}
~Proxy(){
delete mOrig;
}
bool DoSomething(int value) {
return mOrig->DoSomething(value);
}
private :
Proxy(const Proxy &);
const Proxy &operator=(const Proxy &);
Original *mOrig;
}
<1-1>代理模式
另一種方案是在此方案的基礎(chǔ)上增加代理和原始API共享虛擬接口成福,目的是更好的保持這兩個(gè)api同步
前提是能夠修改原始API
class IOriginal {
public:
virtual bool DoSomething(int value) = 0;
};
class Original : public IOriginal {
public:
bool DoSomething(int value);
}
class Proxy : public IOriginal {
public :
Proxy() : mOrig(new Original()) {}
~Proxy(){
delete mOrig;
}
bool DoSomething(int value) {
return mOrig->DoSomething(value);
}
private :
Proxy(const Proxy &);
const Proxy &operator=(const Proxy &);
Original *mOrig;
}
提示:代理提供了一個(gè)接口碾局,此接口將函數(shù)調(diào)用轉(zhuǎn)發(fā)到具有相同形式的另一個(gè)接口
試用場(chǎng)景
如果要修改Original類(lèi)的行為但是要保持它的接口不變,代理模式非常適合奴艾,它尤其適用于Original是第三方庫(kù)類(lèi)净当,自己很難直接修改.