一、题目分析
同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能:
1.正常餐品结算和找零。
2.基本套餐结算和找零。
3.使用优惠劵购买餐品结算和找零。
4.可在一定时间段参与店内活动(自行设计或参考官网信息)。
5.模拟打印小票的功能(写到文件中)。
基本要求:
1.程序设计风格良好,控制台界面友好,最多两人一组完成任务。
2.实现功能测试代码,确保程序的健壮性。
3.画出使用的设计模式图。
二、设计模式图
三、算法思路(核心代码及说明)
(1)食物接口
package KFC;
/*
* 食物接口
*/
public interface Food {
//打印食物信息
void printMessage();
}
(2)抽象食物类
package KFC;
/*
* 抽象的食物类
*/
public abstract class StractBaseFood {
//种类
public String kind;
//数量
public int num;
//价格
public float price;
//总价格方法
public float totalprice(){
return this.num*this.price;
}
}
(3)汉堡基类
package KFC;
/*
* 汉堡基类
*/
public abstract class Hamburg extends StractBaseFood implements Food{
//打印食物信息
public void printMessage() {
System.out.println(this.kind+"\t单价:"+this.price+"\t数量:"+this.num+"\t合计"+this.totalprice());
}
public float totalPrice() {
return this.num*this.price;
}
}
(4)具体的汉堡食物类
package KFC;
/*
* 具体的汉堡食物
*/
public class KfcHamburg extends Hamburg{
//构造方法
public KfcHamburg(int num) {
//香辣鸡腿堡
this.kind = "香辣鸡腿堡";
this.price = 16.0f;
this.num = num;
}
}
(5)薯条基类
package KFC;
/*
* 薯条基类
*/
public abstract class FrenchFries extends StractBaseFood implements Food{
//打印食物信息
public void printMessage() {
System.out.println(this.kind+"\t单价:"+this.price+"\t数量:"+this.num+"\t合计"+this.totalprice());
}
public float totalPrice() {
return this.num*this.price;
}
}
(6)具体的薯条食物类
package KFC;
/*
* 具体的薯条食物
*/
public class KfcFrenchFries extends FrenchFries{
//构造方法
public KfcFrenchFries(int num) {
//薯条
this.kind = "薯条";
this.price = 9.0f;
this.num = num;
}
}
(7)冰激凌基类
package KFC;
/*
* 冰激凌基类
*/
public abstract class Icecream extends StractBaseFood implements Food{
//打印食物信息
public void printMessage() {
System.out.println(this.kind+"\t单价:"+this.price+"\t数量:"+this.num+"\t合计"+this.totalprice());
}
public float totalPrice() {
return this.num*this.price;
}
}
(8)具体的冰激凌食物类
package KFC;
/*
* 具体的冰激凌
*/
public class KfcIcecream extends Icecream {
//构造方法
public KfcIcecream(int num) {
//薯条
this.kind = "冰激凌";
this.price = 6.0f;
this.num = num;
}
}
(9)饮品基类
package KFC;
/*
* 饮品基类
*/
public abstract class Juice extends StractBaseFood implements Food{
//打印食物信息
public void printMessage() {
System.out.println(this.kind+"\t单价:"+this.price+"\t数量:"+this.num+"\t合计"+this.totalprice());
}
public float totalPrice() {
return this.num*this.price;
}
}
(10)具体的饮品类
package KFC;
/*
* 具体的饮品
*/
public class KfcJuice extends Juice {
//构造方法
public KfcJuice(int num) {
this.kind = "可乐";
this.price = 7.0f;
this.num = num;
}
}
(11)客户对应的抽象工厂
package KFC;
public class Customer {
//抽象工厂
private IKfcFactory kfcFactory;
//构造方法将抽象工厂作为参数传入
public Customer(IKfcFactory kfcFactory){
this.kfcFactory = kfcFactory;
}
/**
* 订购食物
*/
//订购汉堡
public float orderHamburg(int num){
//获得汉堡
Hamburg hamburg = kfcFactory.createHamburg(num);
//输出订购信息
hamburg.printMessage();
//返回总价
return hamburg.totalPrice();
}
//订购薯条
public float orderFrenchFries(int num){
//获得薯条
FrenchFries frenchFries = kfcFactory.createFrenchFries(num);
//输出订购信息
frenchFries.printMessage();
//返回总价
return frenchFries.totalPrice();
}
//订购冰激凌
public float orderIcecream(int num){
//获得冰激凌
Icecream icecream = kfcFactory.createIcecream(num);
//输出订购信息
icecream.printMessage();
//返回总价
return icecream.totalPrice();
}
//订购饮品
public float orderJuice(int num){
//获得饮品
Juice juice = kfcFactory.createJuice(num);
//输出订购信息
juice.printMessage();
//返回总价
return juice.totalPrice();
}
}
(12)针对客户的点餐类
package KFC;
import java.util.Date;
import java.util.Scanner;
import java.text.SimpleDateFormat;
import java.text.ParseException;
public class CustomerOrder {
public static void main(String[] args) throws ParseException{
int diancan=1;
double sum=0;
double sumt=0;
int edu=0;
int huodong=3;
int num=-1;//用户输入0返回菜单
//获取当前时间并与开业时间进行比较确定是否可以参加活动
Date date1=new Date();
Date date2=new Date();
Date date3=new Date();
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
date1=f.parse(f.format(new Date())); //这是获取当前时间
date2=f.parse("2019-05-11 1:59:59");
date3=f.parse("2020-05-11 1:59:59");
if(date1.getTime()>date2.getTime()&date1.getTime()<date3.getTime()){//数据比较
huodong=3;
}
else{
huodong=0;
}
/**
* 定义一个肯德基(IKfcFactory类型)
*/
IKfcFactory kfcFactory = new IKfcFactory();
/**
* 创建客户
*/
Customer customer = new Customer(kfcFactory);
/**
* 客户开始点餐
*/
@SuppressWarnings("resource")
Scanner sc=new Scanner(System.in);
System.out.println("\t欢迎使用KFC点餐系统");
do{
System.out.println("**************************************");
System.out.println("\t1、单品点餐\t");
System.out.println("\t2、套餐点餐");
System.out.println("\t3、查看单品菜单");
System.out.println("\t4、查看套餐菜单");
System.out.println("\t5、了解店铺活动");
System.out.println("**************************************");
System.out.println("请选择:");
int choose = sc.nextInt();
switch(choose){
case 1:
System.out.println("**************"+"\n"+"1.香辣鸡腿堡\n"+"2.薯条\n"+"3.冰激凌\n"+"4.可乐\n"+"**************");
while(diancan==1){
@SuppressWarnings("deprecation")
String shijian=new Date().toLocaleString();
System.out.println("是否继续点餐(y/n)");
String dianbudian=sc.next();
if(dianbudian.equals("n")){
System.out.println("您的点餐时间为"+shijian);
System.out.println("您的总消费为"+sum);
System.out.println("请输入付款金额");
int fukuan=sc.nextInt();
System.out.println("请输入是否有优惠券(1/0)");
int youhuiquan=sc.nextInt();
if(youhuiquan==1){
System.out.println("请输入优惠券额度");
edu=sc.nextInt();
}
double zhaoling=fukuan+edu-sum+huodong;
if(huodong==3){
System.out.println(" 您的付款额为"+fukuan+"\n 优惠券额度为"+edu+"\n目前您可参与店内满5减3的活动"+ " \n 共收取您"+(sum-edu-huodong)+" \n 您的找零为"+zhaoling);
}
else{
System.out.println(" 您的付款额为"+fukuan+"\n 优惠券额度为"+edu+"\n目前暂无店内活动参与"+ " \n 共收取您"+(sum-edu-huodong)+" \n 您的找零为"+zhaoling);
}
break;
}
System.out.println("请输入所选食物编号");
int choice=sc.nextInt();
System.out.println("数量");
int jifen1=sc.nextInt();
if(choice==1){
float sum1 = customer.orderHamburg(jifen1);
sum +=sum1;
}
else if(choice==2){
float sum2 = customer.orderFrenchFries(jifen1);
sum +=sum2;
}
else if(choice==3){
float sum3 = customer.orderIcecream(jifen1);
sum +=sum3;
}
else if(choice==4){
float sum4 = customer.orderJuice(jifen1);
sum +=sum4;
}
System.out.println("总花费"+sum);
}
break;
case 2:
System.out.println("1.套餐1:");
System.out.println("\t**香辣鸡腿堡 *1**\n\t**薯条 *1**\n\t**冰激凌 *1**\n");
System.out.println("2.套餐2:");
System.out.println("\t**香辣鸡腿堡 *1\n\t**薯条 *1**\n\t**可乐 *1**\n");
System.out.println("3.套餐3:");
System.out.println("\t**香辣鸡腿堡 *2**\n\t**薯条 *1**\n\t**冰激凌 *1**\n\t**可乐 *1**\n");
while(diancan==1){
@SuppressWarnings("deprecation")
String shijian=new Date().toLocaleString();
System.out.println("是否继续点餐(y/n)");
String dianbudian=sc.next();
if(dianbudian.equals("n")){
System.out.println("您的点餐时间为"+shijian);
System.out.println("您的总消费为"+sum);
System.out.println("请输入付款金额");
int fukuan=sc.nextInt();
System.out.println("请输入是否有优惠券(1/0)");
int youhuiquan=sc.nextInt();
if(youhuiquan==1){
System.out.println("请输入优惠券额度");
edu=sc.nextInt();
}
double zhaoling=fukuan+edu-sum+huodong;
if(huodong==3){
System.out.println(" 您的付款额为"+fukuan+"\n 优惠券额度为"+edu+"\n目前您可参与店内满5减3的活动"+ " \n 共收取您"+(sum-edu-huodong)+" \n 您的找零为"+zhaoling);
}
else{
System.out.println(" 您的付款额为"+fukuan+"\n 优惠券额度为"+edu+"\n目前暂无店内活动参与"+ " \n 共收取您"+(sum-edu-huodong)+" \n 您的找零为"+zhaoling);
}
break;
}
System.out.println("请输入所选食物编号");
int choice=sc.nextInt();
System.out.println("数量");
int jifen1=sc.nextInt();
if(choice==1){
float sum1 = customer.orderHamburg(jifen1);
float sum2 = customer.orderFrenchFries(jifen1);
float sum3 = customer.orderIcecream(jifen1);
sum +=(sum1+sum2+sum3);
sumt +=sum;
}
else if(choice==2){
float sum1 = customer.orderHamburg(jifen1);
float sum2 = customer.orderFrenchFries(jifen1);
float sum4 = customer.orderJuice(jifen1);
sum +=(sum2+sum4+sum1);
sumt +=sum;
}
else if(choice==3){
float sum1 = customer.orderHamburg(jifen1);
float sum2 = customer.orderFrenchFries(jifen1);
float sum3 = customer.orderIcecream(jifen1);
float sum4 = customer.orderJuice(jifen1);
sum +=(sum1*2+sum2+sum3);
sumt +=sum;
}
System.out.println("总花费"+sumt);
}
break;
case 3:
System.out.println("**************"+"\n"+"1.香辣鸡腿堡\n"+"2.薯条\n"+"3.冰激凌\n"+"4.可乐\n"+"**************");
break;
case 4:
System.out.println("1.套餐1:");
System.out.println("\t**香辣鸡腿堡 *1**\n\t**薯条 *1**\n\t**冰激凌 *1**\n");
System.out.println("2.套餐2:");
System.out.println("\t**香辣鸡腿堡 *1\n\t**薯条 *1**\n\t**可乐 *1**\n");
System.out.println("3.套餐3:");
System.out.println("\t**香辣鸡腿堡 *2**\n\t**薯条 *1**\n\t**冰激凌 *1**\n\\t**可乐 *1**\\n");
break;
case 5:System.out.println("亲,本店正值开业周年庆庆,为答谢广大顾客的支持,"
+ "\n本店决定凡在2019-05-11至2020-05-11内在本店消费的顾客"
+ "\n可享受满5元减3元的活动!!!!!!!");
break;
}
}while(num==0);
}
}
四、运行结果
<1>菜单显示
<2>单品点餐显示(同查看单品菜单显示)
<3>了解店铺活动显示
<4>套餐点餐显示(同查看套餐显示)
<5>完整的流程结果