C++ 裝飾者模式

 

裝飾者模式就是實現一些被裝飾者主體,以後由若干了裝飾者方法能夠對被裝飾者進行動態裝飾。經過使用組合的方式,避免使用繼承。能夠動態擴充,相對靈活,可是缺點是實現的類比較多。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;
}

測試結果

 

 

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息