装饰模式
买奶茶案例:
先看uml图:
DrinkMilkTea类是我们的顶层接口,定义了两个方法,一个显示这杯奶茶多钱,一个显示用了什么材料。MilkTea类就是我们要定义的具体对象类,负责显示一杯基本奶茶多钱。而我们的Material类就是我们的抽象Decorate类了。
代码如下:建议自己copy到本地跑一下呢。QAQ
#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
class DrinkMilkTea{
public:
virtual double getMilkTeaPrice() = 0;
virtual string useMaterials() = 0;
};
class MilkTea : public DrinkMilkTea{
public:
virtual double getMilkTeaPrice(){
return 8;
}
virtual string useMaterials(){
return "原味奶茶 ";
}
};
class Material : public DrinkMilkTea{
public:
DrinkMilkTea* drinkMilkTea;
void GetMaterial(DrinkMilkTea* DrinkMilkTea){
this->drinkMilkTea = DrinkMilkTea;
}
virtual double getMilkTeaPrice(){
return drinkMilkTea->getMilkTeaPrice();
}
virtual string useMaterials(){
return drinkMilkTea->useMaterials();
}
};
class Pudding : public Material{
public:
Pudding(DrinkMilkTea* DrinkMilkTea){
Material::GetMaterial(DrinkMilkTea);
}
virtual double getMilkTeaPrice(){
return Material::getMilkTeaPrice() + 2;
}
virtual string useMaterials(){
return Material::useMaterials().append("加入布丁 ");
}
};
class Barley : public Material{
public:
Barley(DrinkMilkTea* DrinkMilkTea){
Material::GetMaterial(DrinkMilkTea);
}
virtual double getMilkTeaPrice(){
return Material::getMilkTeaPrice() + 3;
}
virtual string useMaterials(){
return Material::useMaterials()+"加入青稞 ";
}
};
class Coconut : public Material{
public:
Coconut(DrinkMilkTea* DrinkMilkTea){
Material::GetMaterial(DrinkMilkTea);
}
virtual double getMilkTeaPrice(){
return Material::getMilkTeaPrice() + 1.5;
}
virtual string useMaterials(){
return Material::useMaterials()+"加入椰果 ";
}
};
class Pearl : public Material{
public:
Pearl(DrinkMilkTea* DrinkMilkTea){
Material::GetMaterial(DrinkMilkTea);
}
virtual double getMilkTeaPrice(){
return Material::getMilkTeaPrice() + 1.5;
}
virtual string useMaterials(){
return Material::useMaterials()+"加入珍珠 ";
}
};
int main(){
DrinkMilkTea* milktea = new MilkTea;
cout<<milktea->useMaterials()<<"总价 :" <<milktea->getMilkTeaPrice()<<"元"<<endl;
milktea = new Pearl(milktea) ;
// cout<<milktea->useMaterials()<<"总价 :" <<milktea->getMilkTeaPrice()<<"元"<<endl;
milktea = new Coconut(milktea) ;
// cout<<milktea->useMaterials()<<"总价 :" <<milktea->getMilkTeaPrice()<<"元"<<endl;
milktea = new Coconut(milktea) ;
cout<<milktea->useMaterials()<<"总价 :" <<milktea->getMilkTeaPrice()<<"元"<<endl;
}
输出结果:
原味奶茶 总价 :8元
原味奶茶 加入珍珠 加入椰果 加入椰果 总价 :12.5元