#include <iostream>
#include <memory>
class Component {
public:
virtual void show() = 0;
};
class ConcreteComponent : public Component {
public:
void show() override { std::cout << "In ConcreteComponent show()." << std::endl; }
};
class Decorator : public Component {
public:
Decorator(std::shared_ptr<Component> cc) : cc(cc) {}
protected:
std::shared_ptr<Component> cc = nullptr;
};
class ConcreteDecoratorA : public Decorator {
public:
ConcreteDecoratorA(std::shared_ptr<Component> cc) : Decorator(cc) {}
void show() override {
std::cout << "In ConcreteDecoratorA show()." << std::endl;
cc->show();
}
};
class ConcreteDecoratorB : public Decorator {
public:
ConcreteDecoratorB(std::shared_ptr<Component> cc) : Decorator(cc) {}
void show() override {
std::cout << "In ConcreteDecoratorB show()." << std::endl;
cc->show();
}
};
int main(int argc, char *argv[]) {
std::shared_ptr<Component> cc = std::make_shared<ConcreteComponent>();
std::shared_ptr<Component> d1c = std::make_shared<ConcreteDecoratorA>(cc);
std::shared_ptr<Component> d2c = std::make_shared<ConcreteDecoratorB>(d1c);
d2c->show();
return 1;
}