一. 题目分析及要求
同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能:
1.正常餐品结算和找零。
2.基本套餐结算和找零。
3.使用优惠劵购买餐品结算和找零。
4.模拟打印小票的功能(写到文件中)。
基本要求:
1.实现功能测试代码,确保程序的健壮性。
2.画出使用的设计模式图。
二. 设计模式
单点食物
采用简单工厂模式,利用Java反射机制来实现食品类的实例化。
工厂类名 : ( SimFoodFactory )
套餐产品
采用抽象工厂模式,实现套餐系列产品的生成(三个)
工厂类名:(ComboOneFactory, ComboSecondFactory ,ComboThirdFactory )
三. 类图设计
四. 算法实现
1.实体类 Food
public class Food {
public Integer id;
public String name;
public Double price;
public Integer getId(){
return id;
}
public String getName(){
return name;
}
public Double getPrice(){
return price;
}
}
2.Drink 类,Eat 类 继承 Food基类
public class Eat extends Food {
public Float quality;
public Float getQuality(){
return quality;
}
@Override
public String toString(){
return "Eat{"+
"quality=" +quality+
", id="+ id +
", name='"+name +'\''+
", price="+price+
'}' ;
}}
3.单种食物,单种饮料分别继承Eat 及 Drink
如:①食物单品
public class ChipsItem extends Eat {
public ChipsItem() {
this.id=1006;
this.name="波纹霸王薯条";
this.price=12.0;
this.quality=50f;
}
}
②饮料单品
public class BeerItem extends Drink {
public BeerItem(){
this.id = 1004;
this.name = "百威啤酒";
this.price= 15.0;
this.capacity= 120f;
}
}
4.简单工厂,通过反射机制加载食物类实例(单点)
import kfc.order.item.Food;
/**
*
* 简单工厂,反射加载食物类实例(单点食物)
*/
public class SimFoodFactory {
public Food getFood(Class c){
try{
return (Food) Class.forName(c.getName()).newInstance();
}catch (InstantiationException | IllegalAccessException| ClassNotFoundException e){
e.printStackTrace();
}
return null;
}
}
5.套餐组合通过CombFactory 接口的实现来加载
mport kfc.order.item.Food;
import java.util.List;
/**
* 抽象工厂,加载KFC组合套餐
*/
public interface CombFactory {
List<Food> getCombo();
}
具体一号套餐
import kfc.order.item.BeerItem;
import kfc.order.item.ChickenItem;
import kfc.order.item.Food;
import java.util.ArrayList;
import java.util.List;
/**
* 啤酒炸鸡 (1)号套餐
*/
public class ComboOneFactory implements CombFactory{
@Override
public List<Food> getCombo(){
List<Food> foodOneList= new ArrayList<Food>();//存储套餐产品
Food chick=new ChickenItem();//实例化套餐内的产品
Food beer =new BeerItem();
chick.price=chick.price-2;//套餐的优惠,炸鸡价格减2元
beer.price=beer.price-1;//套餐的优惠,啤酒价格减1元
foodOneList.add(chick);
foodOneList.add(beer);
return foodOneList;//返回套餐集合
}
}
6.FoodControler 类 通过函数处理具体点餐事务
import kfc.order.item.*;
import kfc.order.service.ComboOneFactory;
import kfc.order.service.ComboSecondFactory;
import kfc.order.service.ComboThirdFactory;
import kfc.order.service.SimFoodFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class FoodControler {
static SimFoodFactory simFoodFactory = new SimFoodFactory();//简单工厂实例化
static List<Food> foodList = new ArrayList<>();
public void service(){
Scanner sc = new Scanner(System.in);
String choose = sc.nextLine();
switch (choose){
case "7":
foodList = new ComboOneFactory().getCombo();//抽象工厂产生套餐1
break;
case "8":
foodList = new ComboSecondFactory().getCombo();//抽象工厂产生套餐2
break;
case "9":
foodList = new ComboThirdFactory().getCombo();//抽象工厂产生套餐3
break;
case"1":
//香辣炸鸡
Food food_1= simFoodFactory.getFood(ChickenItem.class);//反射加载单品食物
foodList.add(food_1);
break;
case"2":
//香辣鸡腿堡
Food food_2 = simFoodFactory.getFood(HamburgerItem.class);
foodList.add(food_2);
break;
case"3":
//薯条
Food food_3 = simFoodFactory.getFood(ChipsItem.class);
foodList.add(food_3);
break;
case"4":
//美式
Food food_4 = simFoodFactory