意图
装饰模式就是对一个对象进行装饰,换句话说,就是对一个对象增加额外的功能。
需求
一位美女早上起来化妆,需要打粉底、画眉毛、涂口红、带耳环等过程。
需求分析
面对这样的需求,可以用单纯的添加方法,这是不可取的。如果遇到这位美女第二天想换另外一种方式,那怎么办呢?设计模式的根本目的及时实现高内聚、低耦合,这样对于编程来说,装饰模式是一个不错的选择。
参与者
1、Component
定义一个对象的接口
2、ConcreteComponent
一个Component的具体对象,可以给这个对象添加一些职责
3、Decorator
定义一个接口,这个Decorator即继承Component,又聚合Component,或句话说,就是需要继承Component,又拥有一个Component的属性
4、CocnreteDecorator
一个Decorator的具体对象,进行装饰模式的执行过程
UML类图
编码实现过程
本人已经在Visual Studio 2013上亲测,完全可以运行
#include <iostream>
#include <string>
class Component
{
public:
virtual std::string dress() = 0;
virtual ~Component(){}
};
class ConcreteComponent :public Component
{
public:
std::string dress()override
{
return "化妆:";
}
};
class Decorator :public Component
{
public:
Decorator(Component* cmp) :m_cmp(cmp){}
virtual std::string dress() = 0;
protected:
Component* m_cmp;
};
class ConcreteDecoratorA :public Decorator
{
public:
ConcreteDecoratorA(Component* cmp) :Decorator(cmp){}
std::string dress()override
{
return m_cmp->dress() + " 打粉底";
}
};
class ConcreteDecoratorB :public Decorator
{
public:
ConcreteDecoratorB(Component* cmp) :Decorator(cmp){}
std::string dress()override
{
return m_cmp->dress() + " 涂口红";
}
};
class ConcreteDecoratorC :public Decorator
{
public:
ConcreteDecoratorC(Component* cmp) :Decorator(cmp){}
std::string dress()override
{
return m_cmp->dress() + " 带耳环";
}
};
class ConcreteDecoratorD :public Decorator
{
public:
ConcreteDecoratorD(Component* cmp) :Decorator(cmp){}
std::string dress()override
{
return m_cmp->dress() + " 刷眉毛";
}
};
//内存释放
#ifndef DELETE
#define DELETE(p) {if(p){delete(p);(p)=nullptr;}}
#endif
int main(int argc, char* argv[])
{
Component* woman = new ConcreteComponent();
Component* a = new ConcreteDecoratorA(woman);
Component* b = new ConcreteDecoratorB(a);
Component* c = new ConcreteDecoratorC(b);
Component* d = new ConcreteDecoratorD(c);
std::cout << d->dress() << std::endl;
DELETE(d);
DELETE(c);
DELETE(b);
DELETE(a);
DELETE(woman);
system("pause");
return 0;
}