52 lines
993 B
C++
52 lines
993 B
C++
#include <iostream>
|
|
#include <memory>
|
|
|
|
using namespace std;
|
|
|
|
class Coffee {
|
|
public:
|
|
virtual void make() = 0;
|
|
virtual ~Coffee() = default;
|
|
};
|
|
|
|
|
|
class SimpleCoffee : public Coffee {
|
|
public:
|
|
virtual void make() override {
|
|
cout << "Coffee";
|
|
}
|
|
};
|
|
|
|
class MilkDecorator : public Coffee {
|
|
unique_ptr<Coffee> coffee;
|
|
public:
|
|
MilkDecorator(unique_ptr<Coffee> c) : coffee(move(c)) {
|
|
}
|
|
virtual void make() override {
|
|
coffee->make();
|
|
cout << " + Milk";
|
|
}
|
|
};
|
|
|
|
|
|
class SugarDecorator: public Coffee {
|
|
unique_ptr<Coffee> coffee;
|
|
public:
|
|
SugarDecorator(unique_ptr<Coffee> c) : coffee(move(c)) {
|
|
}
|
|
virtual void make() override {
|
|
coffee->make();
|
|
cout << " + Sugar";
|
|
}
|
|
};
|
|
|
|
|
|
int main() {
|
|
auto coffee = make_unique<SimpleCoffee>();
|
|
auto milk_coffee = make_unique<MilkDecorator>(move(coffee));
|
|
auto sugar_coffee = make_unique<SugarDecorator>(move(milk_coffee));
|
|
|
|
sugar_coffee->make();
|
|
cout << endl;
|
|
}
|