程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C++ 裝飾者模式

C++ 裝飾者模式

編輯:關於C語言

 

裝飾者模式就是實現一些被裝飾者主體,之後由若干了裝飾者方法可以對被裝飾者進行動態裝飾。通過使用組合的方式,避免使用繼承。可以動態擴充,相對靈活,但是缺點是實現的類比較多。

 

 

Componet 裝飾者模式就是定義一個被裝飾者的基類,實現一些被裝飾者的行為,之後實現具體的被裝飾者對象。

 

Decorator在被裝飾者的基類的基礎上實現裝飾者基類,裝飾者基類要繼承被裝飾者的基類,此基類實現了裝飾者要實現的接口。對可對原有接口就行修改。

 

之後實現具體的裝飾者,其保存了需要裝飾的被裝飾者實體對象,之後調用方法對裝飾者進行裝飾。

 

 

下面以一個簡單的例子來實現裝飾者模式,首先定義一個被裝飾者基類為人。

之後實現各個被裝飾者實體為遼寧人或山東人等。

在後定義一個裝飾者基類,繼承被裝飾者基類,並可以對其接口進行修改。規范裝飾者實體對象所要實現的行為。

最後定義具體的裝飾者,其保存了要裝飾的實體對象,並實現對被裝飾者的裝飾。

 

代碼如下:

被裝飾者虛基類

/**
被裝飾者虛基類
**/
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;
}

測試結果

 

 

本文出自 “風清揚song” 博客,請務必保留此出處http://2309998.blog.51cto.com/2299998/1291015

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved