#include <iostream>
class Beverage { //饮料 超类
public :
//std::string description = "未知饮料"; 思考,为何这样使用成员变量不行?????????????????????????????????????????
virtual std::string getDescription() {
return "未知饮料";
}
virtual double cost() = 0;
};
class CondimentDecorator :public Beverage {//调料品 超类
public:
virtual std::string getDescription()=0;
};
class Espresso :public Beverage { //浓缩咖啡饮料
public:
std::string getDescription() {
return "浓缩咖啡饮料";
}
double cost() {
return 1.99;
}
};
class HouseBlend :public Beverage { //家常咖啡饮料
public:
std::string getDescription() {
return "家常咖啡饮料";
}
double cost() {
return 1.88;
}
};
//下面定义装饰者
class Mocha :public CondimentDecorator {
public:
Beverage *beverage;
Mocha(Beverage *beverage) {
this->beverage = beverage;
}
std::string getDescription() {
return beverage->getDescription() + ",摩卡味";
}
double cost() {
return 2.0 + beverage->cost();
}
};
class Soy :public CondimentDecorator {
public:
Beverage* beverage;
Soy(Beverage* beverage) {
this->beverage = beverage;
}
std::string getDescription() {
return beverage->getDescription() + ",大豆味";
}
double cost() {
return 4.0 + beverage->cost();
}
};
class Whip :public CondimentDecorator {
public:
Beverage* beverage;
Whip(Beverage* beverage) {
this->beverage = beverage;
}
std::string getDescription() {
return beverage->getDescription() + ",奶油味";
}
double cost() {
return 9.9 + beverage->cost();
}
};
int main() {
Beverage *beverage1 = new Espresso();
std::cout << beverage1->getDescription() <<" 价格:" <<beverage1->cost()<<std::endl;
Beverage *beverage2 = new HouseBlend();
std::cout << beverage2->getDescription() << " 价格:" << beverage2->cost()<<std::endl;
beverage2 = new Whip(beverage2);
beverage2 = new Soy(beverage2);
beverage2 = new Mocha(beverage2);
std::cout << beverage2->getDescription() << " 价格:" << beverage2->cost() << std::endl;
delete beverage1;
delete beverage2;
return 0;
}