This structural pattern increases the functionality of a class.
Looks similar to a proxy, but it gets the object injected (aggregation).
#include <memory>
#include <iostream>
// Interface
class IHuman {
public:
virtual void wakeUp() = 0;
};
// Normal class
class Human: public IHuman {
public:
void wakeUp() {
std::cout << "Eat breakfast." << std::endl;
}
};
// Decorator
class Hero: public IHuman {
public:
Hero(std::unique_ptr<IHuman> human) : m_Human(std::move(human)) {}
void wakeUp() {
m_Human->wakeUp();
std::cout << "Save the world." << std::endl;
}
private:
std::unique_ptr<IHuman> m_Human;
};
int main() {
std::unique_ptr<IHuman> human(new Human());
std::unique_ptr<IHuman> hero(new Hero(std::move(human)));
hero->wakeUp();
// ...
return 0;
}