Decorator Design Pattern Example
Understand the implementation of the decorator design pattern.
We'll cover the following...
In the previous lesson, we saw a coding example of a decorator design pattern. Here, we’ll look at another example of a decorator design pattern. But this time, we’ll make a small change in our code: we won’t create a decorator. Instead, the concrete decorator class will inherit the component class directly.
Example
#include <iostream>#include <string>struct Shape{virtual std::string str() = 0;virtual float getWidth() = 0;virtual float getHeight() = 0;};class Rectangle : public Shape{float width = 10.0f;float height = 5.0f;public:std::string str() override{return std::string("A rectangle of width ") + std::to_string(width) + " and height " + std::to_string(height);}float getWidth() override{return width;}float getHeight() override{return height;}};class MarginShape : public Shape{float margin;Shape& shape;float width;float height;public:MarginShape(float m, Shape& s) : shape(s){margin = m;width = shape.getWidth() + 2*margin;height = shape.getHeight() + 2*margin;}std::string str() override{return shape.str() + std::string(" with a margin of ") + std::to_string(margin);}float getWidth() override{return width;}float getHeight() override{return height;}};int main(){Rectangle rectangle;MarginShape marginShape(2.0f, rectangle);std::cout << rectangle.str() << " Width: " << rectangle.getWidth() << " and Height: " << rectangle.getHeight() << std::endl;std::cout << marginShape.str() << " Width: " << marginShape.getWidth() << " and Height: " << marginShape.getHeight() << std::endl;}
Decorator design pattern example
Code explanation
Let’s look at the code line by line: