裝飾者模式就是實現一些被裝飾者主體,以後由若干了裝飾者方法能夠對被裝飾者進行動態裝飾。經過使用組合的方式,避免使用繼承。能夠動態擴充,相對靈活,可是缺點是實現的類比較多。ide
Componet 裝飾者模式就是定義一個被裝飾者的基類,實現一些被裝飾者的行爲,以後實現具體的被裝飾者對象。函數
Decorator在被裝飾者的基類的基礎上實現裝飾者基類,裝飾者基類要繼承被裝飾者的基類,此基類實現了裝飾者要實現的接口。對可對原有接口就行修改。學習
以後實現具體的裝飾者,其保存了須要裝飾的被裝飾者實體對象,以後調用方法對裝飾者進行裝飾。測試
下面以一個簡單的例子來實現裝飾者模式,首先定義一個被裝飾者基類爲人。對象
以後實現各個被裝飾者實體爲遼寧人或山東人等。blog
在後定義一個裝飾者基類,繼承被裝飾者基類,並能夠對其接口進行修改。規範裝飾者實體對象所要實現的行爲。繼承
最後定義具體的裝飾者,其保存了要裝飾的實體對象,並實現對被裝飾者的裝飾。接口
代碼以下:圖片
被裝飾者虛基類get
/** 被裝飾者虛基類 **/ class CHuman { public: //這裏Info信息是被裝飾者的虛函數,可是裝飾者 //想要修改此方法時,能夠經過裝飾者的虛基類繼承被 //裝飾者的虛基類並從新實現其原有方法 virtual string Info() { m_sInfo = "沒有任何信息"; return m_sInfo; } //存虛函數,派生類必須實現 virtual int Leavl() = 0; protected: string m_sInfo; };
被裝飾者具體實現類 遼寧人
/** 被裝飾者具體實現類 **/ class CLiaoningHuman :public CHuman { public: CLiaoningHuman() { m_sInfo = "遼寧人"; } virtual int Leavl() { return 0; } };
被裝飾者具體實現類 山東人
/** 被裝飾者具體實現類 **/ class CShanDongHuman :public CHuman { public: CShanDongHuman() { m_sInfo = "山東人"; } virtual int Leavl() { return 0; } };
裝飾者虛基類
/** 裝飾者虛基類,定義了裝飾者具體對象 所要必須實現的接口,並對被裝飾者的基類 接口進行修改 **/ class Decorator:public CHuman { public: /** 繼承了被裝飾者的主要接口,並對須要修改的接口 進行修改,覆蓋了被裝飾紙的Info接口,並在具體裝飾者 對象上具體實現 **/ virtual string Info() = 0; };
裝飾者實體對象 武當武功
/** 裝飾者實現具體類 **/ class CDecratorWuDang : public Decorator { public: CDecratorWuDang(CHuman *pCHuman) { m_pCHuman = pCHuman; } //實現裝飾者基類的存虛函數 (此接口修改了被裝飾者的虛基類接口) virtual string Info() { return m_pCHuman->Info() + " 學習了武當功夫 "; } virtual int Leavl() { return m_pCHuman->Leavl() + 1; } private: //保存具體的被裝飾者對象 CHuman *m_pCHuman; };
裝飾者實體對象 少林武功
/** 裝飾者實現具體類 **/ class CDecratorShaoLin : public Decorator { public: CDecratorShaoLin(CHuman *pCHuman) { m_pCHuman = pCHuman; } //實現裝飾者基類的存虛函數 (此接口修改了被裝飾者的虛基類接口) virtual string Info() { return m_pCHuman->Info() + " 學習了少林功夫 "; } virtual int Leavl() { return m_pCHuman->Leavl() + 2; } private: //保存具體的被裝飾者對象 CHuman *m_pCHuman; };
裝飾者實體對象 華山武功
/** 裝飾者實現具體類 **/ class CDecratorShaoLin : public Decorator { public: CDecratorShaoLin(CHuman *pCHuman) { m_pCHuman = pCHuman; } //實現裝飾者基類的存虛函數 (此接口修改了被裝飾者的虛基類接口) virtual string Info() { return m_pCHuman->Info() + " 學習了少林功夫 "; } virtual int Leavl() { return m_pCHuman->Leavl() + 2; } private: //保存具體的被裝飾者對象 CHuman *m_pCHuman; };
測試函數
int main(int argc, char* argv[]) { //定義被裝飾者實體對象 CHuman *pCHuman = new CLiaoningHuman(); //定義裝飾者,並將被裝飾者傳入對其進行裝飾 pCHuman = new CDecratorWuDang(pCHuman); pCHuman = new CDecratorShaoLin(pCHuman); pCHuman = new CDecratorHuaShan(pCHuman); cout<<pCHuman->Info()<<endl; cout<<pCHuman->Leavl()<<endl; pCHuman = new CShanDongHuman(); pCHuman = new CDecratorWuDang(pCHuman); pCHuman = new CDecratorShaoLin(pCHuman); cout<<pCHuman->Info()<<endl; cout<<pCHuman->Leavl()<<endl; cout<<endl<<"Press any key exit....."<<endl; char c=getchar(); c=getchar(); return 0; }
測試結果