1. 描述
不该变原有对象的代码,动态的给对象增加新的功能。
装饰可以看成一条功能扩展链。新加的节点为前面的节点拓展功能。
2.优点
1)扩展对象功能更加灵活
2)不同的装饰类可以随意组合
3. 缺点
装饰子类多,并且注意顺序的装饰。
4. 结构
1)抽象构件:主要定义抽象接口,子类实现装饰职责
2)具体构件:装饰的原型,装饰链的起点。
3)抽象装饰:
4)具体装饰
5. UML
6. 代码示例
#include "stdafx.h"
#include <iostream>
//1.抽象构件
class Person
{
public:
virtual void show()=0;//给对象添加职责
};
//2.具体构件
class Xiaoming:public Person
{
public:
void SetName(std::string name)
{
_Name = name;
}
std::string GetName()
{
return _Name;
}
void show()
{
std::cout << "装扮的"<<_Name.c_str() << std::endl;
};
private:
std::string _Name;
};
//3.抽象构件
class Finery :public Person//服饰
{
public:
virtual void Decorate(Person *component)
{
_Component = component;
}
virtual void show()
{
_Component->show();
}
protected:
Person * _Component;
};
//4.具体构件
class TShirts :public Finery//服饰
{
public:
void show()
{
std::cout << "大T恤 ";//额外职责
_Component->show();
}
};
class BigTrouser :public Finery//服饰
{
public:
void show()
{
std::cout << "垮裤 ";
_Component->show();
}
};
int main()
{
Xiaoming * xiaoming = new Xiaoming;
xiaoming->SetName("小明");
TShirts * tShirts = new TShirts;
tShirts->Decorate(xiaoming);
BigTrouser * bigTrouser = new BigTrouser;
bigTrouser->Decorate(tShirts);
bigTrouser->show();
getchar();
return 0;
}