装饰模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。有时我们希望给某个对象而不是整个类添加一些功能,这样便可以轻而易举的组合出功能各异的对象,而不是从基类到子类专门有一条线来生成这样一个特定功能的对象。
同时可以精简基类的功能,避免在基类中加入更多的只有在特定的情况下才使用到的数据跟方法。
#include "stdafx.h"
#include <memory>
#include <iostream>
#include <string>
class Object
{
private:
std::string m_strName;
public:
Object()
{
};
Object(std::string strName)
{
m_strName = strName;
};
virtual void Show()
{
std::cout << m_strName.c_str() << " "<< "dress up" << std::endl;
}
};
class Person : public Object
{
public:
Person(std::string strName) : Object(strName)
{
};
};
class Finery : public Object
{
protected:
Object* m_pcomponent;
public:
void Decorate(Object* pcomponent)
{
m_pcomponent = pcomponent;
}
virtual void Show()
{
if (m_pcomponent != nullptr)
m_pcomponent->Show();
}
};
class Tshirts : public Finery
{
public:
virtual void Show()
{
std::cout << "TShirt" << " ";
Finery::Show();
}
};
class BigTrousers : public Finery
{
public:
virtual void Show()
{
std::cout << "BigTrouser" << " ";
Finery::Show();
}
};
class Shoes : public Finery
{
public:
virtual void Show()
{
std::cout << "Shoe" << " ";
Finery::Show();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Person p("Jack");
Tshirts ts;
ts.Decorate(&p);
BigTrousers bt;
bt.Decorate(&ts);
Shoes sh;
sh.Decorate(&bt);
//sh.Show();
Object* pObj = &sh;
pObj->Show();
system("pause");
return 0;
}
