类和对象—多态—案例2—制作饮品

案例描述:

制作饮品的大致流程为:煮水-冲泡-倒入杯中-加入辅料
利用多态技术实现本案例,提供抽象制作产品基类,提供子类制作咖啡和茶叶

思路解析:

1. 定义抽象基类
  • 创建 `AbstractDrinking` 抽象类,该类定义了制作饮品的通用接口。

  • 包含四个纯虚函数:`Boil()`(煮水)、`Brew()`(冲泡)、`PourInCup()`(倒入杯中)和 `PutSomething()`(加入辅料),这些函数需要在派生类中具体实现。

  • 提供一个 `makeDrink()` 成员函数,该函数按顺序调用上述四个纯虚函数,定义了制作饮品的通用流程。

2. 定义具体饮品类
  • 定义 `Coffee` 类,继承自 `AbstractDrinking` 抽象类。

  • 实现 `Boil()`、`Brew()`、`PourInCup()` 和 `PutSomething()` 四个纯虚函数,具体描述制作咖啡的步骤,如煮开水、冲泡咖啡、倒入杯中、加入糖和牛奶。

  • 定义 `Tee` 类(可能拼写有误,应为 `Tea`),同样继承自 `AbstractDrinking` 抽象类。

  • 实现 `Boil()`、`Brew()`、`PourInCup()` 和 `PutSomething()` 四个纯虚函数,具体描述制作茶的步骤,如煮开水、冲泡茶叶、倒入杯中、加入柠檬。

3. 定义工作函数
  • 定义 `doWork()` 函数,该函数接受一个指向 `AbstractDrinking` 类的指针作为参数。

  • 在函数内部调用 `makeDrink()` 函数制作饮品。

  • 使用 `delete` 释放动态分配的内存,避免内存泄漏。

4. 定义测试函数
  • 定义 `test01()` 函数,用于测试制作咖啡和茶的功能。

  • 调用 `doWork()` 函数制作咖啡,并在制作完成后输出分隔线。

  • 再次调用 `doWork()` 函数制作茶。

5. 主函数
  • 在 `main()` 函数中调用 `test01()` 函数,启动测试流程。

  • 返回 0 表示程序正常结束。 通过这种设计,代码实现了制作不同饮品的通用流程,同时利用多态性可以根据传入的具体饮品对象执行相应的制作步骤。

代码实现:

cpp 复制代码
#include<iostream>
using namespace std; 

class AbstractDrinking{
	
public:
	
	//煮水 
	virtual void Boil() = 0;
	
	//冲泡 
	virtual void Brew() = 0;
	
	//倒入杯中
	virtual void PourInCup() = 0;
	
	//加入辅料
	virtual void PutSomething() = 0; 
	
	//制作饮品
	void makeDrink(){
		
		Boil();
		Brew();
		PourInCup();
		PutSomething(); 
	} 
};

class Coffee :public AbstractDrinking{
	
public:
	 
	 //煮水
	virtual void Boil(){
	 	
	 	cout << "煮开水" << endl;
	 } 
	 
	 //加入辅料
	virtual void Brew(){
	 	
	 	cout << "冲泡咖啡" << endl;
	 } 

	 //倒入杯中 
	virtual void PourInCup(){
	 	
	 	cout << "倒入杯中" << endl;
	 } 
	 
	 //加入辅料
	virtual void PutSomething(){
	 	
	 	cout << "加入糖和牛奶" << endl;
	 } 
};

class Tee :public AbstractDrinking{
	
public:
	 
	 //煮水
	virtual void Boil(){
	 	
	 	cout << "煮开水" << endl;
	 } 
	 
	 //加入辅料
	virtual void Brew(){
	 	
	 	cout << "冲泡茶叶" << endl;
	 } 

	 //倒入杯中 
	virtual void PourInCup(){
	 	
	 	cout << "倒入杯中" << endl;
	 } 
	 
	 //加入辅料
	virtual void PutSomething(){
	 	
	 	cout << "加入柠檬" << endl;
	 } 
};

void doWork(AbstractDrinking * abs){
	
	abs->makeDrink();
	delete abs;
}

void test01(){
	
	doWork(new Coffee);
	
	cout << "-----------------" << endl;
	
	doWork(new Tee);
}

int main(){
	
	test01();
	
	return 0;
} 
相关推荐
HackerKevn8 分钟前
【项目】构建高性能多线程内存池:简化版 tcmalloc 实现指南
c++·高并发内存池·tcmalloc·池化技术
会飞的土拨鼠呀13 分钟前
SP B\nRebuild Priorit> 如何用python去掉\n
开发语言·windows·python
珊瑚里的鱼19 分钟前
【双指针】专题:LeetCode 202题解——快乐数
开发语言·c++·笔记·算法·leetcode·职场和发展
王磊鑫31 分钟前
重返JAVA之路——图书管理系统
java·开发语言
xx155802862xx37 分钟前
matlab中进行海浪模型仿真
开发语言·matlab
2401_858286111 小时前
CD27.【C++ Dev】类和对象(18)友元和内部类
开发语言·c++·类和对象
(王子变青蛙)1 小时前
C++初始
开发语言·c++·程序人生
莫有杯子的龙潭峡谷1 小时前
4.15 代码随想录第四十四天打卡
c++·算法
极客先躯1 小时前
高级java每日一道面试题-2025年4月06日-微服务篇[Nacos篇]-如何诊断和解决Nacos中的常见问题?
java·开发语言·微服务
灋✘逞_兇1 小时前
快速幂+公共父节点
数据结构·c++·算法·leetcode