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;
}

测试结果

 

 

你可能感兴趣的:(C++装饰者模式)