装饰模式,就是动态地为已有功能添加更多功能的一种方式把每个要装饰的功能放在单独的类中,让他包装它所有装饰的对象。所以需要执行特殊行为时,客户代码就可以在运行时根据需要有选择、按顺序的使用装饰功能包装对象。这也是和建造者模式不同的地方。
装饰者模式的优势是:可以简化核心类,把核心职责和装饰功能区分开。下面是简单示例:
#include <iostream>
#include <string>
class Person
{
public:
Person(){ }
Person(const std::string &name)
{
this->m_name = name;
}
//核心功能
virtual void show()
{
std::cout << "装扮的" << m_name << std::endl;
}
private:
std::string m_name;
};
class Finery :public Person
{
protected:
Person *m_person;
public:
void Decorate(Person *componert)
{
this->m_person = componert;
}
void show() override
{
if (m_person !=nullptr)
{
m_person->show();
}
}
};
class TShirts : public Finery
{
public:
void show()override
{
//装饰功能
std::cout << "T恤";
Finery::show(); /*核心功能*/
}
};
class TBigTrouser : public Finery
{
public:
void show()override
{
//装饰功能
std::cout << "肥裤子";
Finery::show();
}
};
int main()
{
Person *person = new Person("小菜");
TBigTrouser *bt = new TBigTrouser;
TShirts *ts = new TShirts;
bt->Decorate(person);
ts->Decorate(bt);
ts->show();
/*先调用自身的show,再调用父类,涉及多态,接着实际调用bt的show,再接着调用下一层的show----*/
delete person;
delete bt;
delete ts;
return 0;
}