一. 题目分析及要求

同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用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;}@Overridepublic 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();//抽象工厂产生套餐1break;case "8":foodList = new ComboSecondFactory().getCombo();//抽象工厂产生套餐2break;case "9":foodList = new ComboThirdFactory().getCombo();//抽象工厂产生套餐3break;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;}@Overridepublic 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;}@Overridepublic 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 {@Overridepublic 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();//抽象工厂产生套餐1break;case "8":foodList = new ComboSecondFactory().getCombo();//抽象工厂产生套餐2break;case "9":foodList = new ComboThirdFactory().getCombo();//抽象工厂产生套餐3break;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 博客

Java 实现简单的KFC点餐结算相关推荐

  1. Java实现简单的KFC点餐系统(未实现可视化)

    一.实现功能预览 1.正常餐品结算和找零. 2.基本套餐结算和找零. 3.使用优惠劵购买餐品结算和找零. 4.可在一定时间段参与店内活动. 5.模拟打印小票的功能(写到文件中). 餐品有: (1)香辣 ...

  2. 抽象工厂模式实现简单的kfc点餐

    KFC点餐系统实现思路: 抽象工厂模式提供了一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体实现类.抽象工厂模式允许客户使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品 ...

  3. java swing实现简单KFC点餐系统

    同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能: 1.正常餐品结算 ...

  4. 工厂方法模式完成简单KFC点餐

    同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能: 1.正常餐品结算 ...

  5. 简单的javaweb版kfc点餐收银系统

    简单的javaweb版kfc点餐收银系统,包含单例模式与工厂模式详解 说明:本次作业实现为简单的网页版,由 两人组队 共同完成. 基本需求: 1.正常餐品结算和找零. 2.基本套餐结算和找零. 3.使 ...

  6. Java期末项目--KFC点餐小界面

    程序类: 每断代码后面都加有注释!!!附上三张商品图片! package JavaDome2;import javax.swing.*; import java.awt.*; import java. ...

  7. kfc扫描点餐系统java_Java实现KFC点餐系统过程解析

    这篇文章主要为大家详细介绍了java实现KFC点餐系统,模拟肯德基快餐店的收银系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信 ...

  8. 用C++模拟KFC点餐系统

    一.题目名称:模拟肯德基收银系统 二.题目内容: 同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2 ...

  9. 点餐系统java_java实现KFC点餐系统

    这篇文章主要为大家详细介绍了java实现KFC点餐系统,模拟肯德基快餐店的收银系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信 ...

最新文章

  1. javascript开关_JavaScript开关案例简介
  2. C++ 使用 curl 进行 http 请求(GET、POST、Download)的封装
  3. Apache+MySQL+PHP安装指南
  4. Java+eclipse的配置
  5. duapp获取mysql用户名密码等等……
  6. 【牛客 - 1080E】tokitsukaze and Segmentation(dp,递推,思维)
  7. zabbix邮箱报警设置
  8. 什么是机器学习?(上)
  9. oracle中 initcpa,oracle  11g rman备份
  10. html动态绑定树形菜单,jQuery ztree实现动态树形多选菜单
  11. [2019杭电多校第五场][hdu6629]string matching(扩展kmp)
  12. 硬盘文件系统系列之FAT
  13. 烟雾检测模块ADPD188BI介绍与应用(一)
  14. 一个萌新的学习如何写BUG记录(学无止境,更无止境)
  15. 2016 黑客必备的Android应用都有哪些?
  16. MP地面站二次开发教程(二)MP的框架与修改
  17. html前端开发学年论文,web前端毕业设计论文.doc
  18. Java案例——猫狗案例加入跳高功能分析及其代码实现(面向对象)
  19. git clone项目文件时报错解决remote: Enumerating objects: 19, done. remote: Counting objects: 100% (19/19), don
  20. 为西部AV和IT集成商构建国际合作平台

热门文章

  1. Unity VS Unreal: 哪个更适合AR/VR开发?
  2. IDEA下载依赖时提示 resolving dependencies of xxx, yyy
  3. 一次对学校AVCON系统的渗透
  4. Android studio 修改Git提交人姓名
  5. gpt磁盘标签linux,解决安装CentOS6.5时 报错 提示“sda 必须有一个GPT磁盘标签”
  6. 4米乘以12米CAD图_江阴AutoCAD橱柜设计培训 江阴CAD培训 江阴CAD制图_江阴吧
  7. 哈哈日语 | 超实用商务日语问题
  8. Python 语法基础
  9. if,if else,else if的区别,以js为例
  10. Python 利用 pyecharts 做数据分析绘图