一、装饰模式简介(Brief Introduction)
动态地给一个对象添加一些额外的职责。
优点:把类中的装饰功能从类中搬移出去,这样可以简化原有的类。有效地把类的核心功能和装饰功能区分开了。
二、角色解析
Component:组件对象的接口,可以给这些对象动态的添加职责
ConcreteComponent:具体的组件对象,实现组件对象接口,通常是被装饰器装饰的原始对象,也就是可以给这个对象动态添加职责
Decorator:所有装饰器的抽象父类,需要定义一个与组件接口一致的接口,并持有一个Component对象,其实就是持有一个被装饰的对象
ConcreteDecorator:实际的装饰器对象,实现具体要向被装饰器对象添加的功能
三、源代码
1、Component代码
class Picture;
class Graphic
{
public:
virtual void draw(){}
virtual void add(Graphic *graphic){}
virtual Picture* getPicture(){return 0;}
};
2、ConcreteComponent代码
class Line:public Graphic
{
public:
virtual void draw()
{
std::cout << "draw a line" << endl;
}
};
class Text:public Graphic
{
public:
virtual void draw()
{
std::cout << "draw text" << std::endl;
}
};
3、Decorator代码
class Decorator:public Graphic
{
public:
Decorator(Graphic *graph):_graph(graph)
{
}
virtual void draw()
{
_graph->draw();
}
private:
Graphic *_graph;
};
4、ConcreDecorator代码
class BorderDecorator:public Decorator
{
public:
BorderDecorator(Graphic *graph):Decorator(graph){}
virtual void draw()
{
Decorator::draw();
std::cout << "draw a border after graphic." << std::endl;
}
};
5、Client代码
/**'
**画一个图
**/
void draw(Graphic *graph)
{
graph->draw();
}
int main()
{
Graphic *text = new Text();
draw(text);
Graphic *decoratorText = new BorderDecorator(text);
draw(decoratorText);
Graphic *line = new Line();
Graphic *p = new Picture();
if (p->getPicture() != 0)
{
p->add(text);
p->add(line);
}
draw(new BorderDecorator(p));
}