装饰模式属于结构型模式,所谓装饰,即修饰的意思。
定义:动态的给一个对象添加一些额外的职责
优点:对于增加功能而言,装饰模式比生产子类更加灵活。
何时使用:
在不改变原来的类和关系的情况下,动态地扩展这个类对象所具有的功能,当然也支持撤销添加的功能。
优点:
装饰模式与继承的目的都是扩展对象的功能,但是装饰模式却可以提供比继承更多灵活性。
通过使用不同的具体装饰类以及这些装饰类的排列组合,我们可以创造出很多不同表现的组合。
缺点:
比起继承而言,代码更复杂了。因为出现了很多装饰类,导致代码变得臃肿。
UML类图:
应用场景:
我们使用一些形容词来修饰鼠标和键盘。
代码(c++):
#include <iostream>
#include <vector>
#include <iostream>
using namespace std;
class Component {
public:
virtual ~Component() {}
virtual void decorate() = 0;
};
class ConcreteComponent :public Component
{
public:
void decorate()
{
cout << "酷炫的 ";
}
};
class Decorator :public Component
{
public:
Decorator() :m_component(nullptr) {}
void setComponent(Component *c)
{
m_component = c;
}
void decorate()
{
if (m_component)
m_component->decorate();
}
protected:
Component* m_component;
};
class ConcreteDecoratorA :public Decorator
{
public:
void run() {
decorate(); //装饰机械键盘
cout << "机械键盘" << endl;
}
};
class ConcreteDecoratorB :public Decorator
{
public:
void run() {
decorate(); //装饰鼠标
cout << "鼠标" << endl;
}
};
//客户端
int main()
{
ConcreteComponent* pC = new ConcreteComponent;
ConcreteDecoratorA* pA = new ConcreteDecoratorA;
ConcreteDecoratorB* pB = new ConcreteDecoratorB;
pA->setComponent(pC); //使用pC来装饰pA
pA->run();
pB->setComponent(pC); //使用pC来装饰pB
pB->run();
if (pC) delete pC;
if (pA) delete pA;
if (pB) delete pB;
getchar();
return 0;
}
输出: