一、源代码:
#include<iostream>
#include<memory>
using namespace std;
class Shape
{
public:
virtual void draw() = 0;
virtual ~Shape() = default;
};
class Rectangle:public Shape
{
public:
virtual void draw() override
{
cout<<"Shape:Rectangle"<<endl;
}
};
class Circle:public Shape
{
public:
virtual void draw() override
{
cout<<"Shape:Circle"<<endl;
}
};
class ShapeDecorator:public Shape
{
public:
ShapeDecorator(shared_ptr<Shape> decoratodShape)
{
this->_decoratedShape = decoratodShape;
}
virtual void draw() override
{
_decoratedShape->draw();
}
protected:
shared_ptr<Shape> _decoratedShape;
};
class RedShapeDecorator:public ShapeDecorator
{
public:
RedShapeDecorator(shared_ptr<Shape> decoratedShape):ShapeDecorator(decoratedShape)
{}
virtual void draw() override
{
_decoratedShape->draw();
setRedBorder();
}
private:
void setRedBorder()
{
cout<<"Border Color:Red"<<endl;
}
};
int main()
{
shared_ptr<Shape> circle = make_shared<Circle>();
shared_ptr<Shape> redCircle = make_shared<RedShapeDecorator>(make_shared<Circle>());
shared_ptr<Shape> redRectangle = make_shared<RedShapeDecorator>(make_shared<Rectangle>());
cout<<"Circle with normal border"<<endl;
circle->draw();
cout<<"\nCircle of red border"<<endl;
redCircle->draw();
cout<<"\nRectangle of red border"<<endl;
redRectangle->draw();
}
二、运行结果:

本文通过C++代码详细解析了装饰者模式的应用,展示了如何在不改变现有代码的情况下为对象添加新的职责。通过具体示例,包括形状类、装饰器基类及具体的红色边框装饰器,阐述了装饰者模式在实际编程中的灵活性和实用性。
547

被折叠的 条评论
为什么被折叠?



