设计模式-装饰模式(实现三)

装饰模式

买奶茶案例:


先看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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值