裝飾器模式
咖啡需要有各種添加風味物。
被添加的咖啡也是一種咖啡
Before
cpp
struct Coffee {
std::optional<int> soy;
std::optional<int> milk;
// 我們可能會動態的增加添加物!
int cost() {
return soy.value_or(0)*2 + milk.value_or(0)*20;
}
};
After
cpp
struct Coffee {
Coffee() = default;
virtual ~Coffee() = default;
virtual int cost() = 0;
};
struct NormalCoffee: public Coffee {
int cost() {
return 20;
}
};
struct SoyCoffee: public Coffee {
Coffee* base_;
int quantity_;
SoyCoffee(Coffee* base, int quantity):
base_(base), quantity_(quantity) {}
int cost() {
return base_->cost() + 2*quantity_;
}
};
struct MilkCoffee: public Coffee {
Coffee* base_;
int quantity_;
MilkCoffee(Coffee* base, int quantity):
base_(base), quantity_(quantity) {}
int cost() {
return base_->cost() + 20*quantity_;
}
};