装饰模式是一种动态的给类中添加新行为的设计模式,装饰模式比生成子类更为灵活,可以给某个对象而不是整个类添加一些功能。值得注意的是装饰模式的装饰类也继承接口类,同时他也有接口类的指针指向他需要装饰的具体类。外表看着像is-a的关系,实际也是has-a的关系。实际应用中装饰类可以同时装饰几个具体类。可以看下边一个简单的代码,体现了装饰模式。
#include "stdafx.h"
#include <iostream>
using namespace std;
class Light
{
public:
virtual void Open() = 0;
virtual void Close() = 0;
};
class ConcreteLight : public Light
{
public:
virtual void Open()
{
cout<<"打开";
}
virtual void Close()
{
cout<<"关闭";
}
};
class DecoratorBlue : public Light
{
public:
DecoratorBlue(Light* light)
: m_light(light)
{
}
public:
virtual void Open()
{
m_light->Open();
cout<<"Blue"<<endl;
}
virtual void Close()
{
m_light->Close();
cout<<"Blue"<<endl;
}
private:
Light* m_light;
};
class DecoratorRed : public Light
{
public:
DecoratorRed(Light* light)
: m_light(light)
{
}
public:
virtual void Open()
{
m_light->Open();
cout<<"Red"<<endl;
}
virtual void Close()
{
m_light->Close();
cout<<"Red"<<endl;
}
private:
Light* m_light;
};
int _tmain(int argc, _TCHAR* argv[])
{
Light* light = new ConcreteLight;
DecoratorBlue* blueLight = new DecoratorBlue(light);
blueLight->Open();
blueLight->Close();
DecoratorRed* redLight = new DecoratorRed(light);
redLight->Open();
redLight->Close();
system("pause");
return 0;
}