一. 题目分析及要求
同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用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.getFood(CafeItem.class);
foodList.add(food_4);
break;
case"5":
//可乐
Food food_5 = simFoodFactory.getFood(CokeItem.class);
foodList.add(food_5);
break;
case"6":
//百威啤酒
Food food_6 = simFoodFactory.getFood(BeerItem.class);
foodList.add(food_6);
break;
default:
System.out.println("您所输入的点餐序号不存在");
foodList = new ArrayList();
}
}}
7.MainApp 类处理结算及顾客选择
其功能实现为其他类实例化对象当做方法参数使用
五. 测试截图
点餐界面截图

小票截图

六. 个人总结
Java Swing 可视化还未能掌握,因此此次程序设计只完成了基本要求。在程序编写中,对Java面向对象的思想有了更深的理解,也提升了编程中解决问题的能力。
在食物的实例化过程中,对建造者设计模式有了进一步的认识。同时对Java的反射机制有了一定的理解。
附 : 源码
package kfc.order.item;
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;
}
}
package kfc.order.item;
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+
'}' ;
}
}
package kfc.order.item;
public class Drink extends Food{
public Float capacity;
public Float getCapacity(){
return capacity;
}
@Override
public String toString(){
return "Drink{"+
"capacity=" +capacity+
", id="+ id +
", name='"+name +'\''+
", price="+price+
'}';
}
}
package kfc.order.item;
public class HamburgerItem extends Eat {
public HamburgerItem(){
this.id = 1001;
this.name = "香辣大虾堡";
this.price = 22.0;
this.quality = 10f;
}
}
package kfc.order.item;
public class CokeItem extends Drink {
public CokeItem(){
this.id = 1003;
this.name ="可口可乐";
this.price = 11.0;
this.capacity = 200f;
}
}
package kfc.order.item;
public class ChipsItem extends Eat {
public ChipsItem() {
this.id=1006;
this.name="波纹霸王薯条";
this.price=12.0;
this.quality=50f;
}
}
package kfc.order.item;
public class ChickenItem extends Eat{
public ChickenItem(){
this.id = 1002;
this.name = "香辣鸡翅";
this.price = 48.0;
this.quality = 100f;
}
}
package kfc.order.item;
public class CafeItem extends Drink {
public CafeItem(){
this.id = 1005;
this.name ="美式咖啡";
this.price = 17.0;
this.capacity =100f;
}
}
package kfc.order.item;
public class BeerItem extends Drink {
public BeerItem(){
this.id = 1004;
this.name = "百威啤酒";
this.price= 15.0;
this.capacity= 120f;
}
}
package kfc.order.service;
import kfc.order.item.Food;
import java.util.List;
/**
* 抽象工厂,加载KFC组合套餐
*/
public interface CombFactory {
List<Food> getCombo();
}
package kfc.order.service;
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;//返回套餐集合
}
}
package kfc.order.service;
import kfc.order.item.CafeItem;
import kfc.order.item.Food;
import kfc.order.item.HamburgerItem;
import java.util.ArrayList;
import java.util.List;
/**
* 咖啡和汉堡 (2)号套餐
*/
public class ComboSecondFactory implements CombFactory {
public List<Food> getCombo(){
List<Food> foodSecondList= new ArrayList<Food>();
Food ham = new HamburgerItem();
Food cafe= new CafeItem();
ham.price = ham.price-1;//套餐组合的优惠 汉堡减一元
cafe.price = cafe.price-0.5;//套餐组合的优惠 咖啡减0.5元
foodSecondList.add(cafe);
foodSecondList.add(ham);
return foodSecondList;
}
}
package kfc.order.service;
import kfc.order.item.ChipsItem;
import kfc.order.item.CokeItem;
import kfc.order.item.Food;
import java.util.ArrayList;
import java.util.List;
/**
* 可乐和薯条 (3)号套餐
*/
public class ComboThirdFactory implements CombFactory {
@Override
public List<Food> getCombo() {
List<Food> foodThreeList = new ArrayList<Food>();
Food chips = new ChipsItem();
Food cola = new CokeItem();
cola.price = cola.price - 1;//套餐组合的优惠
chips.price = chips.price - 0.5;
foodThreeList.add(chips);
foodThreeList.add(cola);
return foodThreeList;
}
}
package kfc.order.service;
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;
}
}
package kfc.order.control;
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.getFood(CafeItem.class);
foodList.add(food_4);
break;
case"5":
//可乐
Food food_5 = simFoodFactory.getFood(CokeItem.class);
foodList.add(food_5);
break;
case"6":
//百威啤酒
Food food_6 = simFoodFactory.getFood(BeerItem.class);
foodList.add(food_6);
break;
default:
System.out.println("您所输入的点餐序号不存在");
foodList = new ArrayList();
}
}}
package kfc.order.control;
import kfc.order.item.Food;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import java.util.List;
public class MoneyAnalyze {
public Double getMoneyCount(List<Food> list ){//,Double disCount,Double tickets){
Double moneyCount = 0.0; //顾客应付钱数
for (Food food:list){
moneyCount += food.price;
}//return moneyCount*disCount-tickets; //计算折扣后应付钱数
return moneyCount;
}
/**
* 找零
* @param inMoney 收入的钱数
* @param count 应收钱数
*/
public Double getChange( Double inMoney,Double count){
return inMoney-count;
}
/**
* 打印小票
*
*/
public void receipt(List<Food>list ,Double disCount,Double tickets) throws IOException{
Date currentTime = new Date();
FileWriter fileWriter= new FileWriter("receipt.txt");
BufferedWriter bw = new BufferedWriter(fileWriter);
bw.write("————————————————————欢迎光临 **有点LOW** KFC————————————————"+"\r\n");
bw.write("\n\n");
bw.write("订单时间:"+currentTime+"\r\n\n");
bw.write("您本次消费清单如下"+"\r\n");
for (Food food:list){
bw.write("ID:"+food.id+"\r\n");
bw.write("食物:"+food.name+"\r\n");
bw.write("金额:"+food.price+"\r\n");
}
bw.write("折扣"+disCount*10 +"折"+"\r\n");
bw.write("优惠"+tickets+"元"+"\r\n");
bw.write("总金额"+((getMoneyCount(list)*disCount)-tickets)+ "\u5143");
bw.flush();
bw.close();
}
}
package kfc.order.control;
import java.io.IOException;
import java.util.Scanner;
public class MainApp {
public static Double tickets=0.0 ;
public static Double disCount=1.0;
MoneyAnalyze moneyAnalyze = new MoneyAnalyze();
static FoodControler foodControler = new FoodControler();
public void interFace()throws IOException{
System.out.println("============================================================");
System.out.println("************************************************************\n");
System.out.println("--------------------欢迎光临KFC------------------------------");
System.out.println("************** 1.点餐 \n");
System.out.println("************** 2.领取优惠卷 (请在购买商品之后查看领取哦) \n");
System.out.println("************** 3.结算 \n");
System.out.println("*************************************************************\n");
System.out.println("=============================================================");
System.out.println("请选择服务类型:");
chooseServe();
}
public void chooseServe() throws IOException {
Scanner sc = new Scanner(System.in);
String inter =sc.nextLine();
while (true){
if(inter.equals("1")){
orderMeal();
break;
}
else if(inter.equals("2")){
System.out.println("满50减3.6元");
System.out.println("满80减5.0元");
System.out.println("请选择服务类型:");
chooseServe();
break;
}
else if(inter.equals("3")){
if(foodControler.foodList!=null){
settlement();
break;}
else {
System.out.println("您当前还未点餐,结算系统锁定,请点餐后选择");
chooseServe();
}
}else {
System.out.println("服务类型不存在,我们正在完善中,请您重新选择 ");
chooseServe();
break;
}}
}
public void orderMeal() throws IOException {
System.out.println("\n");
System.out.println("---------------- 本店推出以下菜品:--------------------------");
System.out.println("① 自选单品");
System.out.println("1. 香辣鸡翅:48元/份 2. 香辣大虾堡:22元/个");
System.out.println("3. 波纹霸王薯条: 12元/份 4. 美式咖啡:17元/杯 ");
System.out.println("5. 可口可乐:11元/杯 6. 百威啤酒:15元/杯 " );
System.out.println("② 人气套餐——有优惠哦");
System.out.println("7. 套餐一:啤酒+炸鸡:60元/份");
System.out.println("8. 套餐二:汉堡+咖啡:37.5元/份");
System.out.println("9. 套餐三:可乐+薯条:21.5元/份");
System.out.println("--------------------------------------------------------------");
System.out.println("请选择餐品序号");
//调用FoodControler 函数Server()
// FoodControler foodControler =new FoodControler();
while(true){
foodControler.service();
System.out.println("您所点的商品如下 :");
System.out.println(foodControler.foodList);
System.out.println("您当前订单金额为:"+moneyAnalyze.getMoneyCount(foodControler.foodList)+"元");
// System.out.println(foodControler.foodList.isEmpty());//测试列表空否
chooseQuit();
break;
}
}
public void chooseQuit() throws IOException {//点餐界面离开选项
System.out.println("继续:【Y】 结算:【S】 返回【A】");
System.out.println("请输入服务类型:");
Scanner sc = new Scanner(System.in);
String item =sc.nextLine();
while (true) {
if (item.equals("A") || item.equals("a")) {
interFace();
break;
} else if (item.equals("Y") || item.equals("y")) {
System.out.println(foodControler.foodList);
// System.out.println("您当前订单金额为:"+moneyAnalyze.getMoneyCount(foodControler.foodList));
orderMeal();
break;
} else if (item.equals("S") || item.equals("s")) {
settlement();
break;
} else {
System.out.println("您所选择的服务不存在,请重新输入:");
chooseQuit();
break;
}
}
}
public void getTickets(){
if(moneyAnalyze.getMoneyCount(foodControler.foodList)<50){
System.out.println("您的订单无法领取优惠券");
}
if(moneyAnalyze.getMoneyCount(foodControler.foodList)>50&&moneyAnalyze.getMoneyCount(foodControler.foodList)<80){
tickets=3.6;
System.out.println("您的订单可以领取3.6元优惠券");
}else if(moneyAnalyze.getMoneyCount(foodControler.foodList)>80){
tickets=5.0;
System.out.println("您的订单可以领取5元优惠券");
}
}
/**
* 通过消费判定折扣
*/
public void settlement() throws IOException {
System.out.println("您的付款金额:");
Scanner sc = new Scanner(System.in);
Double inMoney = sc.nextDouble();
if(moneyAnalyze.getMoneyCount(foodControler.foodList)>50){
//tickets= 3.6;
disCount=0.86;
}else if(moneyAnalyze.getMoneyCount(foodControler.foodList)>80){
//tickets=5;
disCount=0.75;
}
System.out.println("您本次消费如下:");
getTickets();
System.out.println("您本次消费:"+moneyAnalyze.getMoneyCount(foodControler.foodList));
System.out.println("优惠:"+tickets+" 元");
System.out.println("折扣:"+disCount*10+" 折");
System.out.println("折后消费:"+(moneyAnalyze.getMoneyCount(foodControler.foodList)*disCount));
System.out.println("收您:"+inMoney+" 元");
System.out.println("找零:"+(moneyAnalyze.getChange(inMoney,moneyAnalyze.getMoneyCount(foodControler.foodList)*disCount-tickets))+" 元");
moneyAnalyze.receipt(foodControler.foodList,disCount,tickets);//调用函数打印小票
}
}
package kfc.order.control;
import java.io.IOException;
public class StartKFC {
public static void main(String[] args) throws IOException {
MainApp mainApp = new MainApp();
mainApp.interFace();
}
}
//工厂模式算法源自CSDN 博客

2543

被折叠的 条评论
为什么被折叠?



