问题描述

参考肯德基官网的信息模拟肯德基快餐店的收银系统,结合设计模式(2种以上)至少实现系统的以下功能:

1.正常餐品结算和找零。

2.基本套餐结算和找零。

3.使用优惠劵购买餐品结算和找零。

4.可在一定时间段参与店内活动(自行设计或参考官网信息)。

5.模拟打印小票的功能(写到文件中)。

问题分析

要产生不同的食物类,不难想到要用到抽象工厂模式,即定义抽象工厂类,具体工厂类生产对应的具体产品。

要根据不同的结账方式实现餐品结算,就可以用到策略模式,即用每一个结账类封装不同的结账方式。

UML类图

工厂模式

策略模式

方法说明

本系统的层级结构如下:

本系统的菜单层级关系如下:

以下就每个方法进行具体说明。

(食物基本信息类baseFood)

因为要在主菜单打印食物信息,所以需要一个食物信息类和打印食物信息的基类。

public class baseFood {// 类别protected String kind;// 数量protected int num;// 价格protected float price;// 合计public float totalPrice(){return this.num * this.price;}
}

(打印食物信息接口)

public interface IFood {String printMessage();
}

(抽象肯德基工厂接口类)

抽象工厂类,定义了如下抽象方法。

createHamburg()制作汉堡包;

createIceCream()制作冰激凌;

createBeverage()制作饮料;

createChicken()制作炸鸡;

其中的参数kind传入食品的代号,num传入食品的数量。

public interface KFCFactoryImpl {public Hamburg createHamburg(int kind,int num);public IceCream createIceCream(int kind, int num);public Beverage createBeverage(int kind, int num);public Chicken createChicken(int kind, int num);
}

(具体肯德基厨房类)

具体肯德基厨房实现抽象接口生产所需的食物。本程序实现了四个抽象产品:

汉堡包Hamburg

冰激凌IceCream

饮料Beverage

炸鸡 Chicken

//具体肯德基厨房工厂
public class KFCFoodFactory implements KFCFactoryImpl {@Override//制作汉堡包public Hamburg createHamburg(int kind, int num) {if(1 == kind){return new BigMacHam(num);//巨无霸}else if(2 == kind){return new SpicyChickenHam(num);//香辣鸡腿堡}else if(3 == kind){return new OrleansChickenHam(num);//奥尔良鸡腿堡}else{return null;}}//制作冰激凌@Overridepublic IceCream createIceCream(int kind, int num) {if(1 == kind){return new strawberrySundae(num);//草莓圣代}else if(2 == kind){return new blueberrySundae(num);//蓝莓圣代}else if(3 == kind){return new iceCreamCone(num);//原味甜筒}else{return null;}}//制作饮料@Overridepublic Beverage createBeverage(int kind, int num) {if(1 == kind){return new CocaCola(num);//可口可乐}else if(2 == kind){return new juice(num);//九珍果汁}else{return null;}}//制作炸鸡@Overridepublic Chicken createChicken(int kind, int num) {if(1 == kind){return new chickenNugget(num);//上校鸡块}else if(2 == kind){return new chickenRolls(num);//鸡肉卷}else if(3 == kind){return new popcornChicken(num);//鸡米花}else{return null;}}
}

汉堡包基类Hamburg)

这里既用到了extends继承食物信息基类又用到了implements实现打印食物接口。

abstract class Hamburg extends baseFood implements IFood{@Overridepublic String printMessage() {return (this.kind+"\t"+this.price+"\t"+this.num+"\t"+this.totalPrice());}
}

(汉堡包派生类BigMacHam)

public class BigMacHam extends Hamburg{public BigMacHam(int num) {this.kind = "巨无霸大汉堡";this.num = num;this.price = 25.0f;}
}

对于新奥尔良堡、香辣鸡腿堡的具体汉堡包食物类与这里列出的巨无霸汉堡大同小异,只需要修改this.kind。其余的冰激凌类、炸鸡类、饮料类和其派生类的关系与汉堡包类与其派生类的关系同理,在此不做赘述。

(顾客类)

这里顾客类的成员函数ShowBill实现打印小票文件,OutBill显示订单,这里利用集合动态数组添加订单信息。

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;public class Customer {private KFCFactoryImpl kfcFactory;public Customer(KFCFactoryImpl kfcFactory) {this.kfcFactory = kfcFactory;}private ArrayList<String> billList = new ArrayList<>();//打印小票文件public void showBill() throws IOException {BufferedWriter bw = new BufferedWriter(new FileWriter("D://text.txt", true));bw.write("*****************************************************\r\n");bw.write("             **欢迎光临荔枝堡**             \r\n");SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式bw.write("订餐时间:"+df.format(new Date())+"\r\n");// new Date()为获取当前系统时间bw.write("名称    \t\t单价\t数量\t价格\r\n");for(String str:billList){bw.write(str);bw.newLine();bw.flush();}}//显示订单public void outBill(){for(String str:billList){System.out.println(str);}}//获得汉堡public float getHamburg(int choose,int num){Hamburg hamburg;hamburg = kfcFactory.createHamburg(choose,num);System.out.print(hamburg.printMessage());billList.add(hamburg.printMessage());return hamburg.totalPrice();}//获得冰淇淋public float getIceCream(int choose,int num){IceCream icecream;icecream = kfcFactory.createIceCream(choose,num);System.out.print(icecream.printMessage());billList.add(icecream.printMessage());return icecream.totalPrice();}//获得饮料public float getBeverage(int choose,int num){Beverage beverage;beverage = kfcFactory.createBeverage(choose,num);System.out.print(beverage.printMessage());billList.add(beverage.printMessage());return beverage.totalPrice();}//获得炸鸡public float getChicken(int choose,int num){Chicken chicken;chicken = kfcFactory.createChicken(choose,num);System.out.print(chicken.printMessage());billList.add(chicken.printMessage());return chicken.totalPrice();}//获得套餐public float getSetMeal(int choose,int num){Hamburg hamburg;Chicken chicken;IceCream iceCream;Beverage beverage;float money;if(1 == choose){hamburg = kfcFactory.createHamburg(3,1);beverage = kfcFactory.createBeverage(2,1);chicken = kfcFactory.createChicken(1,1);billList.add(hamburg.printMessage());billList.add(beverage.printMessage());billList.add(chicken.printMessage());money = Math.round(0.9*(hamburg.totalPrice()+beverage.totalPrice()+chicken.totalPrice())*num);return money;}else if(2 == choose){hamburg = kfcFactory.createHamburg(2,3);beverage = kfcFactory.createBeverage(2,3);chicken = kfcFactory.createChicken(2,2);iceCream = kfcFactory.createIceCream(1,1);billList.add(hamburg.printMessage());billList.add(beverage.printMessage());billList.add(chicken.printMessage());billList.add(iceCream.printMessage());money = Math.round(0.9*(hamburg.totalPrice()+beverage.totalPrice()+chicken.totalPrice()+iceCream.totalPrice())*num);return money;}else if(3 == choose){hamburg = kfcFactory.createHamburg(1,2);iceCream = kfcFactory.createIceCream(3,2);beverage = kfcFactory.createBeverage(2,2);chicken = kfcFactory.createChicken(1,1);billList.add(hamburg.printMessage());billList.add(beverage.printMessage());billList.add(chicken.printMessage());billList.add(iceCream.printMessage());money = Math.round(0.9*(hamburg.totalPrice()+beverage.totalPrice()+chicken.totalPrice()+iceCream.totalPrice())*num);return money;}else{System.out.println("没有该套餐!!!");return 0;}}
}

(菜单类Menu)

由菜单类实现主界面的选择显示界面。

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;/*** @Author:Star* @Date:Created in 18:54 2019/5/11* @Description:*/
class Menu {Scanner input = new Scanner(System.in);private KFCFactoryImpl kfcFactory;private Customer customer;private float hamburgMoney;private float iceCreamMoney;private float beverageMoney;private float chickenFiresMoney;private float setMealMoney;private float sumMoney;public Menu(KFCFactoryImpl kfcFactory, Customer customer) {this.kfcFactory = kfcFactory;this.customer = customer;}//欢迎界面public void menu() throws IOException {System.out.println("******欢迎光临荔枝堡***");System.out.println("    ***          ***   ");System.out.println("  ********    ********  ");System.out.println("***         *        ***");System.out.println("  ***  1.开始点餐   *** ");System.out.println("    ** 2.退出系统  **   ");System.out.println("      **         **    ");System.out.println("         **   **"       );System.out.println("            **         ");System.out.print("请选择>");int choose = input.nextInt();switch (choose){case 1:productionMenu();int pay = payMoney(customer,getMoney());printBill(customer,getMoney(),pay);break;case 2:System.out.println("您已成功退出点餐系统...");default:System.out.println("选择错误....");}}//食物产品界面public void productionMenu() throws IOException {boolean flag = true;while(flag == true){System.out.println("当前商品如下:");System.out.println("==================");System.out.println("1.汉堡");System.out.println("==================");System.out.println("2.冰淇淋");System.out.println("==================");System.out.println("3.饮料");System.out.println("==================");System.out.println("4.烤鸡");System.out.println("==================");System.out.println("5.套餐");System.out.println("==================");System.out.println("6.结束订餐,查看订单");System.out.println("==================");System.out.print("请选择>");int choose = input.nextInt();switch (choose){case 1:hamburgMenu();break;case 2:iceCreamMenu();break;case 3:beverageMenu();break;case 4:chickenFiresMenu();break;case 5:setMeal();break;case 6:float money = getMoney();showBills(customer,money);break;default:System.out.println("选择错误...");}if(choose == 6){flag = false;}}}//汉堡菜单界面public void hamburgMenu(){System.out.println("1.巨无霸-----------25元");System.out.println("2.香辣鸡腿堡--------18元");System.out.println("3.奥尔良鸡腿堡------18元");System.out.print("请选择>");int choose = input.nextInt();System.out.print("请输入数量>");int num = input.nextInt();hamburgMoney = customer.getHamburg(choose,num);}//冰淇淋菜单界面public void iceCreamMenu(){System.out.println("1.草莓圣代------12元");System.out.println("2.蓝莓圣代------12元");System.out.println("3.  甜筒--------6元");System.out.print("请选择>");int choose = input.nextInt();System.out.print("请输入数量>");int num = input.nextInt();iceCreamMoney = customer.getIceCream(choose,num);}//饮料菜单界面public void beverageMenu(){System.out.println("1.可口可乐------12元");System.out.println("2.九珍果汁------11元");System.out.print("请选择>");int choose = input.nextInt();System.out.print("请输入数量>");int num = input.nextInt();beverageMoney = customer.getBeverage(choose,num);}//炸鸡菜单界面public void chickenFiresMenu(){System.out.println("1.上校鸡块------12元");System.out.println("2. 鸡肉卷 ------10元");System.out.println("3. 鸡米花 ------8元");System.out.print("请选择>");int choose = input.nextInt();System.out.print("请输入数量>");int num = input.nextInt();chickenFiresMoney = customer.getChicken(choose,num);}//套餐界面public void setMeal(){System.out.println("1.儿童套餐(奥尔良鸡腿堡+九珍果汁+上校鸡块)------35元");System.out.println("2.家庭套餐(香辣鸡腿堡(3个)+九珍果汁(3杯)+鸡肉卷(2个)+草莓圣代)------118元");System.out.println("3.情侣套餐(巨无霸(2个)+甜筒(2个)+九珍果汁(2杯)+上校鸡块)------99元");System.out.print("请选择>");int choose = input.nextInt();System.out.print("请输入数量>");int num = input.nextInt();setMealMoney = customer.getSetMeal(choose,num);}//获得总金额public float getMoney(){sumMoney = hamburgMoney+iceCreamMoney+beverageMoney+chickenFiresMoney+setMealMoney;return sumMoney;}//打印账单public static void printBill(Customer customer, float sumMoney, int pay) throws IOException {customer.showBill();BufferedWriter bw=new BufferedWriter(new FileWriter("D://text.txt",true));bw.write("总计: "+sumMoney);bw.newLine();bw.write("付款:"+pay);bw.newLine();float y=pay-sumMoney;bw.write("找零:"+y);bw.newLine();bw.write("当前收银员:小荔子\r\n");bw.write("                         欢迎下次光临!^_^                        \r\n");bw.write("******************************************************\r\n");bw.flush();bw.close();}//显示订单public static void showBills(Customer customer,float sumMoney) throws IOException {customer.outBill();System.out.println("总计:"+sumMoney);}//付款界面public int payMoney(Customer customer, float sumMoney){while(true){System.out.print("请输入付款金额:");int pay=input.nextInt();if(pay-sumMoney >= 0){if(pay >= 100){System.out.println("您要使用优惠卷结账吗?(y/n)");System.out.println("优惠卷:满100减20,满200减30!!!");if(input.next().equals("y")){if(pay >= 200){System.out.println("找零:"+(pay-sumMoney+30));}else {System.out.println("找零:"+(pay-sumMoney+20));}}else{System.out.println("找零:"+(pay-sumMoney));}}else{System.out.println("找零:"+(pay-sumMoney));}}else{System.out.println("不够哦!!!");}return pay;}}
}

运行效果

本程序最终的运行效果如下。

开始界面

选餐界面

①单品

②套餐

③查看订单

付款界面

在D盘下生成的小票

总结

模拟肯德基订餐的系统的荔枝堡是运用了工厂方法设计模式设计的一个简单的点餐系统,该系统可以实现正常商品的结算,套餐商品结算,优惠卷的使用以及在文件中记录订餐账单(即模拟订餐小票的打印)。

存在问题:

  1. 编写过程中,思路不清晰。刚开始在写的时候,想法过于简单,所以在实际编写的过程中,一度发现问题并不断迭代。所以在编写代码之前要理清自己的思路,数据的处理,功能实现的具体方法。
  2. 设计模式的应用不熟练导致的代码内聚度不够高,耦合不够低。书本上学习的设计模式运用到实际中还是挺困难的,所对于设计模式的学习还是要多与实际问题结合应用。

一定要善于灵活运用设计模式!!!这一次和组员一起做的过程中因为工厂模式没有理解透彻,所以中途写了很多作废掉的代码......(感谢大佬组员带我)

附录:

相关代码已上传至码云仓库https://gitee.com/xinwenruyi/programs-design-method

(Java)模拟肯德基点餐系统相关推荐

  1. JAVA模拟肯德基点餐系统源码,肯德基点餐界面MFC

    [实例简介] 本程序使用MFC界面实现模拟肯德基点餐的前台 [实例截图] [核心代码] MFC--KFC └── MFC--KFC ├── ActDlg.cpp ├── ActDlg.h ├── Da ...

  2. JAVA模拟肯德基点餐系统源码,肯德基辞职员工透露,用这几句暗语点餐,你拿的分量会比别人多...

    但现在随着物价的上涨,肯德基里面卖的食物,份量也在悄悄的减少,这是让许多热爱肯德基的朋友都伤透了心,不过大家也不要担心,今天就来教大家点餐肯德基时的暗语,这些可都是肯德基离职员工偷偷告诉我的哦~ 冰淇 ...

  3. Java实现肯德基点餐系统

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

  4. 设计模式之Java语言模拟肯德基点餐收银系统

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

  5. Java模拟肯德基快餐店的收银系统

    1.题目名称 模拟肯德基快餐店的收银系统 要求:结合设计模式(2种以上)至少实现系统的以下功能: 1.正常餐品结算和找零. 2.基本套餐结算和找零. 3.使用优惠劵购买餐品结算和找零. 4.可在一定时 ...

  6. Java模拟实现KFC点餐系统

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

  7. 使用java来简单模拟肯德基快餐店的收银系统实现一些功能

    一.题目要求 请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能: 1.正常餐品结算和找零. 2.基本套餐结算 ...

  8. 用java实现KFC收银:请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统

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

  9. 肯德基点餐收银系统(java GUI实现)

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

最新文章

  1. 【怎样写代码】工厂三兄弟之抽象工厂模式(四):抽象工厂模式
  2. 鲲鹏高校行太原站来袭,两大课程一站式掌握未来潮流
  3. 绩点1.8成功逆袭!复旦博士林田成为华为第20位「天才少年」
  4. springboot集成freemarker 配置application.properties详解
  5. python画曲线-如何通过python画loss曲线的方法
  6. 微软2011 Build大会:Windows 8盛大出场(转)
  7. c680和c650_最低10万95,全新F800R、C650Sport和F800GT,BMW三款焕新上市
  8. 【计网】计网----子网掩码,网关,ARP协议的作用
  9. 【oracle】to_date
  10. Common BeanUtils组件的使用(源码)
  11. BZOJ1565[NOI2009]植物大战僵尸——最大权闭合子图+拓扑排序
  12. zoj1022 Parallel Expectations(DP)
  13. eclipse安装教程(win10版本,很全的)
  14. 发布 html win7 工具,win7 天气 Win7自带的桌面天气工具怎么使用
  15. Oracle varchar和varchar2的区别
  16. Java导出Excel(自定义格式)
  17. 短轮询和长轮询的区别到底是什么
  18. 【笔记】架构整洁之道
  19. 小何同学的leetcode刷题笔记 基础篇(01)整数反转
  20. 十进制转为二十六进制

热门文章

  1. 帝国时代3手机单机版java_帝国时代3手游单机版
  2. 计算机教师简介50字,教师50字以内个人简介
  3. 面试时如何谈自己的兴趣爱好
  4. Toward Fast, Flexible, and Robust Low-Light Image Enhancement(实现快速、灵活和稳健的弱光图像增强)CVPR2022
  5. 解读一道微软经典面试题:海盗分宝石
  6. 微信公众号运营错误的四个方式
  7. Quectel EC200N-CN 大尺寸物联网首选LTE Cat 1模块[移远通信]
  8. 计算机专业可取证书名称,职业中专计算机维修专业发的职业资格证书名称叫什..._出版资格_帮考网...
  9. IOS 开发工具准备 gcc,gdb
  10. 中国传媒大学计算机与网络安全学院研究生,林卫国 - 中国传媒大学 - 计算机与网络空间安全学院...