题目:
同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能:
1.正常餐品结算和找零。
2.基本套餐结算和找零。
3.使用优惠券购买餐品结算和找零。
4.可在一定时间段参与店内活动(自行设计或参考官网信息)。
5.模拟打印小票的功能(写到文件中)。
题目分析:
参考:zoey0130Java博客:实现模拟KFC点餐系统(设计模式)
抽象工厂:生成各种抽象事物的方法,如汉堡,甜点,饮料
具体工厂:生成各种具体食物,如香辣鸡腿堡,牛肉堡,冰淇淋,可乐
接口食物类由汉堡类,炸鸡类,套餐类实现,香辣鸡腿堡类继承汉堡类,并加入价格,名称等属性。在顾客类中实现对象的生成
点餐类实现对餐品的选择,以及活动,优惠券的使用。
UML图
代码:
接口:
package 肯德基;
public interface Food { //接口
public void show();
}
实现接口food的类:Hamburger Chicken Drink Dessert Meal
package 肯德基;
public class Hamburger implements Food{
public void show() {
}
public String type; //每个大种类下的具体种类
public int num; //数量
public double price; //价格
}
package 肯德基;
public class Chicken implements Food{ //food接口的实现类
public void show() {
}
public String type; //每个大种类下的具体种类
public int num; //数量
public double price; //价格
}
package 肯德基;
public class Dessert implements Food{
public void show() {
System.out.printf("甜点类");
}
public String type; //每个大种类下的具体种类
public int num; //数量
public double price; //价格
}
package 肯德基;
public class Drink implements Food{
public void show() {
}
public String type; //每个大种类下的具体种类
public int num; //数量
public double price; //价格
}
package 肯德基;
public class Meal implements Food{
public void show() {
}
public String type; //每个大种类下的具体种类
public int num; //数量
public double price; //价格
}
继承Hamburger Chicken Drink Dessert Meal的类Ham1,Chicken1等
package 肯德基;
public class Ham1 extends Hamburger{
public void show() {
System.out.println("香辣鸡腿堡 " );
price=20;
}
public Ham1(int num) {
}
}
package 肯德基;
public class Ham2 extends Hamburger{
public void Ham2(int num) {
}
public void show() {
price=25;
System.out.printf("牛肉堡 ");
}
}
package 肯德基;
public class Chicken1 extends Chicken{ //继承实现类,重写show()函数
public void Chicken1(int num) {
}
public void show() {
price=15;
System.out.println("香辣鸡腿 ");
}
}
package 肯德基;
public class Chicken2 extends Chicken{
public void Chicken2(int num) {
}
public void show() {
price=15;
System.out.println("香辣鸡翅 ");
}
}
package 肯德基;
public class Drink1 extends Drink{
public void Drink1(int num) {
}
public void show() {
price=10;
System.out.println("可乐");
}
}
package 肯德基;
public class Drink2 extends Drink{
public void Drink2(int num) {
}
public void show() {
price=10;
System.out.println("橙汁 ");
}
}
package 肯德基;
public class Ice extends Dessert{
public void Ice(int num) {
}
public void show() {
price=15;
System.out.printf("香草冰淇淋 " );
}
}
package 肯德基;
public class Meal1 extends Meal{
public void creatMeal1(int num) {
}
public void show() {
price=35;
System.out.println("A套餐(香辣鸡腿堡+可乐+薯条) " );
type="A套餐(香辣鸡腿堡+可乐+薯条) 35RMB";
}
}
package 肯德基;
public class Meal2 extends Meal {
public void creatMeal2(int num) {
}
public void show() {
price=45;
System.out.printf("B套餐(牛肉堡+橙汁+冰淇淋+薯条) " );
}
}
抽象工厂类
package 肯德基;
public interface KFCFactory { //抽象工厂,生产抽象食物
public Chicken creatChicken(int kind,int num);
public Hamburger creatHamburger(int kind,int num);
public Drink creatDrink(int kind,int num);
public Dessert creatDessert(int kind,int num);
public Meal creatMeal(int kind,int num);
}
实例工厂类
package 肯德基;
public class KFC implements KFCFactory{ // 实例工厂,生产实例食物
@Override
public Hamburger creatHamburger(int kind, int num) {
// TODO Auto-generated method stub
if(kind==1)
return new Ham1(num);
else if(2==kind)
return new Ham2();
else
return null;
}
@Override
public Drink creatDrink(int kind, int num) {
// TODO Auto-generated method stub
if(1==kind)
return new Drink1();
else if (2==kind)
return new Drink2();
else
return null;
}
@Override
public Dessert creatDessert(int kind, int num) {
// TODO Auto-generated method stub
if(1==kind)
return new Ice();
else
return null;
}
@Override
public Chicken creatChicken(int kind, int num) {
// TODO Auto-generated method stub
if(1==kind)
return new Chicken1();
else if (2==kind)
return new Chicken2();
else
return null;
}
public Meal creatMeal(int kind, int num) {
// TODO Auto-generated method stub
if(1==kind)
return new Meal1();
else if (2==kind)
return new Meal2();
else
return null;
}
}
顾客类
package 肯德基;
public class Clerk {
//肯德基抽象工厂
private KFC factory_1;
//构造方法将抽象工厂传入
public Clerk(KFC factory_1){
this.factory_1 =factory_1;
}
/**
* 订购食物
*/
//汉堡
public double orderHamburgers(int kind,int num){
//获得不同种类的汉堡
Hamburger hamburger = factory_1.creatHamburger(kind, num);
//输出订购信息
hamburger.show();
//返回总价
return hamburger.price*num;
}
//炸鸡
public double orderChickens(int kind, int num){
//获得不同种类鸡
Chicken chicken = factory_1.creatChicken(kind, num);
//输出订购信息
chicken.show();
//返回总价
return chicken.price*num;
}
//甜点
public double orderDessert(int kind, int num){
//获得薯条
Dessert Ice = factory_1.creatDessert(kind, num);
//输出订购信息
Ice.show();
//返回总价
return Ice.price*num;
}
//饮品
public double orderDrinkings(int kind, int num){
//获得不同种类的饮料
Drink drink = factory_1.creatDrink(kind, num);
//输出订购信息
drink.show();
//返回总价
return drink.price*num;
}
//饮品
public double orderMeaL(int kind, int num){
//获得不同种类的饮料
Meal meal = factory_1.creatMeal(kind, num);
//输出订购信息
meal.show();
//返回总价
return meal.price*num;
}
}
点餐类
package 肯德基;
import java.util.Scanner;
public class Order {
/**
* 定义一个肯德基
* (KFCFoodFactory接口类型)
*/
static KFCFactory factory_1 = new KFC();
/**
* 创建职员
*/
static Clerk customer = new Clerk((KFC) factory_1);
static int order; //用户选的的菜系
static int kind; //用户选择的食物
static int num; //数量
public static void main(String[] args) {
//菜单显示,点餐
//OrderFoods.showMenu();
Save t1=new Save();
t1.write();
Menu menu = new Menu();
menu.menu1();
int flag = 1;
int dis = 0;
int m = 0;
int pay;
int lq;
double total = 0; //点餐结束的总价
double total1 = 0;
double total2 = 0;
double total3 = 0;
double total4 = 0;
double total5 = 0;
Scanner sc = new Scanner(System.in);
System.out.println("今日活动:凡在今日单次消费超过88元,可享八折优惠");
while(flag != 0) {
//Scanner sc = new Scanner(System.in);
System.out.println("请输入餐类:");
order = sc.nextInt();
System.out.println("请输入餐品:");
kind = sc.nextInt();
System.out.println("请输入餐品个数:");
num = sc.nextInt();
// PrintStream out = System.out;
//System.setOut(new PrintStream("order.txt"));
switch (order) {
case 1:
total1 = customer.orderHamburgers(kind, num);
break;
case 2:
total2 = customer.orderDessert(kind, num);
break;
case 3:
total3 = customer.orderChickens(kind, num);
break;
case 4:
total4 = customer.orderDrinkings(kind, num);
break;
case 5:
total5 = customer.orderMeaL(kind, num);
break;
default:
System.out.println("对不起,您所选择的餐品错误");
}
//System.setOut(out);
System.out.println("是否有优惠券 1——yes 0——no:");
dis=sc.nextInt();
if(dis==1)
{ System.out.println("优惠券类型:1——十元代金券 2——满40,送香草圣代一个");
m=sc.nextInt();
}
System.out.println("当前消费为" + (total1 +total2 + total3 + total4 +total5));
System.out.println("继续点餐? 1——yes 0——no:");
flag = sc.nextInt();
}
total = total1 +total2 + total3 + total4 +total5;
if(m==1)
{ System.out.println("已使用十元代金券");
total=total-10;
System.out.println("原价为"+(total+10)+"使用优惠券后价格为"+total);
}
if(m==2)
{
if(total>40)
{ System.out.println("您的消费已满40元,赠送本店香草圣代一个");}
}
if (total > 88) {
System.out.println("消费已满88元,立享八折优惠");
System.out.println("total(discount): "+ 0.8*total);
System.out.println("祝您用餐愉快");
}
else {
System.out.println("total: " +total+"元");
System.out.println("祝您用餐愉快");
}
System.out.println("请输入付款金额");
pay=sc.nextInt();
lq=(int) (pay-total);
System.out.println("收款"+pay+"RBM 找零"+lq+"RMB");
}
}
界面类
package 肯德基;
public class Menu {
public void menu1() {
System.out.println(" 欢迎光临肯德基餐厅 ");
System.out.println("----------------------------------------------");
System.out.println(" 1.汉堡类 ");
System.out.println("1.香辣鸡腿堡 20RMB 2.牛肉堡 25RMB ");
System.out.println("----------------------------------------------");
System.out.println(" 2.甜点类 ");
System.out.println("1.冰淇淋 15RMB ");
System.out.println("-----------------------------------------------");
System.out.println(" 3.炸鸡类 ");
System.out.println("1.香辣鸡腿 15RMB 2.香辣鸡翅 15RMB ");
System.out.println("-----------------------------------------------");
System.out.println(" 4.饮料类 ");
System.out.println("1.可乐 10RMB 2.橙汁 10RMB ");
System.out.println("------------------------------------------------");
System.out.println(" 5.套餐类 ");
System.out.println("1.A套餐(香辣鸡腿堡+可乐+薯条) 35RMB ");
System.out.println("2.B套餐(牛肉堡+橙汁+冰淇淋+薯条 ) 45RMB ");
System.out.println("-------------------------------------------------");
}
}
餐品信息类
package 肯德基;
public abstract class FoodInfor {
public String type; //每个大种类下的具体种类
public int num; //数量
public double price; //价格
}
保存信息类(本程序中没用到)
package 肯德基;
import java.io.File;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
public class Save {
public void write() {
Meal1 m1=new Meal1();
try {
File writeName = new File("KFC.txt"); // 相对路径,如果没有则要建立一个新的output.txt文件
writeName.createNewFile(); // 创建新文件,有同名的文件的话直接覆盖
try (FileWriter writer = new FileWriter(writeName);
BufferedWriter out = new BufferedWriter(writer)
) {
// out.write(m1.type); // \r\n即为换行
out.write("欢迎光临肯德基餐厅\r\n"); // \r\n即为换行
out.flush(); // 把缓存区内容压入文件
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
存在的问题
对于同一类餐品无法进行第二次点餐。消费金额没有叠加
原因:当选择继续点餐时,flag=1,循环继续,如果选择了同一餐类,total1-5会被新产生的价格覆盖,无法实现价格的叠加。
程序中还存在着许多问题,还请多多指教。