装饰器模式简介:
在不改变现有类的基础上添加新的功能,属于结构型设计模式,作为现有类的一个包装。
适用场景
- 在不影响其他对象的情况下,以动态的、透明的方式扩展单个对象的职责。
- 处理那些可以撤销的职责
- 当不能采用生成子类的方法进行扩充时,可以使用装饰器设计模式
采用菜鸟教程的例子,这里用C++实现
#include<iostream>
using namespace std;
//创建一个形状的接口
class shape
{
public:
shape() {};
virtual ~shape() {};
virtual void draw()=0;
};
//创建圆形circle类继承形状基类接口
class circle :public shape
{
public:
circle(){};
~circle(){};
void draw();
};
void circle::draw()
{
cout << "draw circle" << endl;
}
//创建一个三角形rectangle类继承形状shape基类
class rectangle :public shape
{
public:
rectangle(){};
~rectangle(){};
void draw();
};
void rectangle::draw()
{
cout << "draw rectangle" << endl;
}
//创建一个形状装饰器ShapeDecorator类继承形状shape基类
class ShapeDecorator:public shape
{
public:
ShapeDecorator(shape *td);
virtual ~ShapeDecorator(){};
void draw();
protected:
shape *decoratedshape;
};
ShapeDecorator::ShapeDecorator(shape *td)
{
decoratedshape = td;
}
void ShapeDecorator::draw()
{
decoratedshape->draw();
}
//扩展ShapeDecorator为RedShapeDecorator
class RedShapeDecorator : public ShapeDecorator
{
public:
RedShapeDecorator(shape *tf);
~RedShapeDecorator(){};
void draw();
private:
void setRedBorder(shape *tg);
};
RedShapeDecorator::RedShapeDecorator(shape *tf):ShapeDecorator(tf)
{
}
void RedShapeDecorator::draw()
{
decoratedshape->draw();
setRedBorder(decoratedshape);
}
//设置边框颜色
void RedShapeDecorator::setRedBorder(shape *tg)
{
cout << "Border Color:Red" << endl;
}
int main()
{
shape *redCircle = (shape*)new RedShapeDecorator(new circle());
shape *redRectangle = (shape*)new RedShapeDecorator(new rectangle());
redCircle->draw();
redRectangle->draw();
delete redCircle;
delete redRectangle;
system("pause");
return 0;
}
在visual studio 2015上运行结果: