fork download
  1. #include <iostream>
  2. #include <memory>
  3. using namespace std;
  4.  
  5. class Configurable {
  6. public:
  7. virtual void SetParameter(int i) { _prop = i; }
  8. virtual int GetParameter() { return _prop; }
  9. private:
  10. int _prop;
  11. };
  12.  
  13. class Algorithm: public Configurable {
  14. public:
  15. virtual ~Algorithm() = default;
  16. virtual void Process() = 0;
  17. };
  18.  
  19. class AlgorithmDecorator: public Algorithm{
  20. public:
  21. AlgorithmDecorator(std::unique_ptr<Algorithm> &&algo): _algo{std::move(algo)} {}
  22. void Process() { _algo->Process(); /* decoration code here */}
  23. void SetParameter(int i) override { _algo->SetParameter(i); }
  24. int GetParameter() override { return _algo->GetParameter(); }
  25. protected:
  26. std::unique_ptr<Algorithm> _algo;
  27. };
  28.  
  29. class ConcreteAlgorithm: public Algorithm {
  30. public:
  31. void Process() { std::cout << GetParameter() << std::endl; }
  32. };
  33.  
  34. int main() {
  35. std::unique_ptr<Algorithm> algo = std::make_unique<ConcreteAlgorithm>();
  36. algo = std::make_unique<AlgorithmDecorator>(std::move(algo));
  37. algo->SetParameter(5);
  38. algo->Process();
  39. return 0;
  40. }
Success #stdin #stdout 0s 5328KB
stdin
Standard input is empty
stdout
5