As you might know, there are different types of a design pattern are there but it is important to know that a decorator design pattern is a structural design pattern
Suppose you want to add new functionalities to the single object of the class but not the entire class dynamically in that case decorator design pattern will be helpful
Consider a simple example where user interface Car can let us add properties (with music system, with GPS navigator) or behaviours to any user interface component
Participants
- Component (Car)
- Concrete component(BMW, Audi)
- Decorator
- Concrete decorator( with music system, with GPS navigator)
Structure
#include <iostream>
#include <string>
using namespace std;
// Component
class Car
{
public:
virtual string Fit_parts () = 0;
virtual float Cost() = 0;
virtual ~Car(){}
};
// Concrete Component
class Audi : public Car
{
public:
string Fit_parts ()
{
return "Audi Car";
}
float Cost()
{
return 3000;
}
};
class BMW : public Car
{
public:
string Fit_parts ()
{
return "BMW Car";
}
float Cost()
{
return 6000;
}
};
// Decorator
class CarDecorator: public Car
{
protected:
Car *m_Car;
public:
CarDecorator(Car *Audi): m_Car(Audi){}
string Fit_parts ()
{
return m_Car->Fit_parts ();
}
float Cost()
{
return m_Car->Cost();
}
};
// Concrete Decorator
class With_music_system: public CarDecorator
{
public:
With_music_system(Car *audi): CarDecorator(audi){}
string Fit_parts ()
{
return m_Car->Fit_parts () + " decorated with music system ";
}
float Cost()
{
return m_Car->Cost() + 400;
}
};
class With_GPS_navigator: public CarDecorator
{
public:
With_GPS_navigator(Car *audi): CarDecorator(audi){}
string Fit_parts ()
{
return m_Car->Fit_parts () + " decorated With GPS navigator ";
}
float Cost()
{
return m_Car->Cost() + 800;
}
};
int main()
{
Car *audi = new Audi();
cout << audi -> Fit_parts () << endl;
cout << audi -> Cost() << endl;
Car *bmw = new BMW();
cout << bmw -> Fit_parts () << endl;
cout << bmw -> Cost() << endl;
Car *decoratedCar = new With_music_system(bmw);
cout << decoratedCar -> Fit_parts () << endl;
cout << decoratedCar -> Cost() << endl;
decoratedCar = new With_GPS_navigator(audi);
cout << decoratedCar -> Fit_parts () << endl;
cout << decoratedCar -> Cost() << endl;
return 0;
}
Output
Audi car
3000
BMW Car 6000
BMW Car decorated with music system
6400
Audi Car decorated with GPS navigator
3800
Leave a Reply