include <iostream> #include <string> #include <memory> /** * The base Component interface */ class Component { public: Component(){std::cout<<"[Constructor] Component\n";} virtual ~Component(){std::cout<<"[Destructor] Component\n";} virtual void Operation() = 0; }; /** * Concrete Components */ class ConcreteComponent : public Component { public: ConcreteComponent(){std::cout<<"[Constructor] ConcreteComponent\n";} ~ConcreteComponent(){std::cout<<"[Destructor] ConcreteComponent\n";} void Operation() override { std::cout<<"ConcreteComponent"; } }; class Decorator : public Component { protected: std::unique_ptr<Component> component_; public: Decorator( std::unique_ptr<Component> component) { component_=std::move(component); std::cout<<"[Constructor] Decorator\n"; } ~Decorator(){std::cout<<"[Destructor] Decorator\n";} void Operation() override { this->component_->Operation(); } }; class ConcreteDecorator : public Decorator { public: ConcreteDecorator( std::unique_ptr<Component> component) : Decorator(std::move(component)) { std::cout<<"[Constructor] ConcreteDecorator\n"; } ~ConcreteDecorator() {std::cout<<"[Destructor] ConcreteDecoratorA\n";} void Operation() override { std::cout<< "ConcreteDecorator("; Decorator::Operation(); std::cout<<")"; } }; int main() { std::unique_ptr<Component> simple=std::make_unique<ConcreteComponent>(); std::cout << "Client: I've got a simple component:\n"; simple->Operation(); std::cout << "\n\n"; std::unique_ptr<Component> decorator = std::make_unique<ConcreteDecorator>(std::move(simple)); std::cout << "Client: Now I've got a decorated component:\n"; decorator->Operation(); std::cout << "\n"; return 0; }