同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能:
1.正常餐品结算和找零。
2.基本套餐结算和找零。
3.使用优惠劵购买餐品结算和找零。
4.可在一定时间段参与店内活动(自行设计或参考官网信息)。
5.模拟打印小票的功能(写到文件中)。
基本要求:
1.程序设计风格良好,控制台界面友好,最多两人一组完成任务。
2.实现功能测试代码,确保程序的健壮性。
3.画出使用的设计模式图。
设计模式图
`package com.demo.factory.model;
/**
*
* 食物基类
*
* @author maofw
*
*/
public abstract class AbstractBaseFood
{
// 类别
protected String kind;
// 数量
protected int num;
// 价格
protected float price;
// 合计
public float totalPrice()
{
return this.num * this.price;
}
package com.demo.factory.model;
/**
* 饮料基类
*
* @author maofw
*
*/
public abstract class Beverage extends AbstractBaseFood implements IFood
{
public void printMesage()
{
System.out.println("--" + this.kind + "饮料,\t单价:" + this.price + ",\t数量:" + this.num + ",\t合计:" + this.totalPrice());
}
}
package com.demo.factory.model;
/**
* 鸡翅基类
*
* @author maofw
*
*/
public abstract class ChickenWings extends AbstractBaseFood implements IFood
{
public void printMesage()
{
System.out.println("--" + this.kind + "风味鸡翅,\t单价:" + this.price + ",\t数量:" + this.num + ",\t合计:" + this.totalPrice());
}
}
package com.demo.factory.model;
import com.demo.factory.model.Beverage;
/**
* 饮料实现类
*
* @author maofw
*
*/
public class ChinaBeverage extends Beverage
{
public ChinaBeverage(int num)
{
this.kind = "可乐";
this.price = 7.0f;
this.num = num;
}
}
package com.demo.factory.model;
import com.demo.factory.model.ChickenWings;
/**
* 鸡翅实现类
*
* @author maofw
*
*/
public class ChinaChickenWings extends ChickenWings
{
public ChinaChickenWings(int num)
{
this.kind = "奥尔良";
this.price = 2.5f;
this.num = num;
}
}
package com.demo.factory.model;
import com.demo.factory.model.FrenchFries;
/**
* 薯条实现类
*
* @author maofw
*
*/
public class ChinaFrenchFries extends FrenchFries
{
public ChinaFrenchFries(int num)
{
this.kind = "普通";
this.price = 8.0f;
this.num = num;
}
}
package com.demo.factory.model;
import com.demo.factory.model.Hamburg;
/**
* 中国风味的麻辣鸡腿汉堡
*
* @author maofw
*
*/
public class ChinaHanburm extends Hamburg
{
/**
* 构造方法
*/
public ChinaHanburm(int num)
{
this.kind = "麻辣";
this.price = 14.0f;
this.num = num;
}
}
package com.demo.factory.model;
import com.demo.factory.model.Beverage;
import com.demo.factory.model.ChickenWings;
import com.demo.factory.model.FrenchFries;
import com.demo.factory.model.Hamburg;
public class ChinaKfcFactory implements IKfcFactory
{
// 生产可乐
public Beverage createBeverage(int num)
{
return new ChinaBeverage(num);
}
// 生产奥尔良烤鸡翅
public ChickenWings createChickenWings(int num)
{
return new ChinaChickenWings(num);
}
// 生产薯条
public FrenchFries createFrenchFries(int num)
{
return new ChinaFrenchFries(num);
}
// 生产麻辣风味鸡腿汉堡
public Hamburg createHamburg(int num)
{
return new ChinaHanburm(num);
}
}
package com.demo.factory.model;
import com.demo.factory.model.Beverage;
import com.demo.factory.model.ChickenWings;
import com.demo.factory.model.FrenchFries;
import com.demo.factory.model.Hamburg;
/**
* 客户类
*
* @author maofw
*
*/
public class Customer
{
// 抽象工厂
private IKfcFactory kfcFactory;
// 构造方法将抽象工厂作为参数传入
public Customer(IKfcFactory kfcFactory)
{
this.kfcFactory = kfcFactory;
}
/**
* 订购食物
*/
// 订购麻辣鸡腿汉堡
public float orderHamburg(int num)
{
// 获得麻辣鸡腿汉堡
Hamburg hamburg = kfcFactory.createHamburg(num);
// 输出订购信息
hamburg.printMesage();
// 返回总价
return hamburg.totalPrice();
}
// 订购奥尔良烤鸡翅
public float orderChickenWings(int num)
{
// 获得奥尔良烤鸡翅
ChickenWings chickenWings = kfcFactory.createChickenWings(num);
// 输出订购信息
chickenWings.printMesage();
// 返回总价
return chickenWings.totalPrice();
}
// 订购薯条
public float orderFrenchFries(int num)
{
// 获得薯条
FrenchFries frenchFries = kfcFactory.createFrenchFries(num);
// 输出订购信息
frenchFries.printMesage();
// 返回总价
return frenchFries.totalPrice();
}
// 订购可乐
public float orderBeverage(int num)
{
// 获得可乐
Beverage beverage = kfcFactory.createBeverage(num);
// 输出订购信息
beverage.printMesage();
// 返回总价
return beverage.totalPrice();
}
}
package com.demo.factory.model;
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 iKfcFactory = new ChinaKfcFactory();
/**
* 创建客户
*/
Customer customer = new Customer(iKfcFactory);
/**
* 客户开始点餐
*/
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.orderChickenWings(jifen1);
sum +=sum3;
}
else if(choice==4){
float sum4 = customer.orderBeverage(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.orderChickenWings(jifen1);
sum +=(sum1+sum2+sum3);
sumt +=sum;
}
else if(choice==2){
float sum1 = customer.orderHamburg(jifen1);
float sum2 = customer.orderFrenchFries(jifen1);
float sum4 = customer.orderBeverage(jifen1);
sum +=(sum2+sum4+sum1);
sumt +=sum;
}
else if(choice==3){
float sum1 = customer.orderHamburg(jifen1);
float sum2 = customer.orderFrenchFries(jifen1);
float sum3 = customer.orderChickenWings(jifen1);
float sum4 = customer.orderBeverage(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);
}
}
package com.demo.factory.model;
/**
* 薯条基类
*
* @author maofw
*
*/
public abstract class FrenchFries extends AbstractBaseFood implements IFood
{
public void printMesage()
{
System.out.println("--" + this.kind + "风味薯条,\t单价:" + this.price + ",\t数量:" + this.num + ",\t合计:" + this.totalPrice());
}
}
package com.demo.factory.model;
/**
* 汉堡基类
*
* @author maofw
*
*/
public abstract class Hamburg extends AbstractBaseFood implements IFood
{
public void printMesage()
{
System.out.println("--" + this.kind + "风味汉堡,\t单价:" + this.price + ",\t数量:" + this.num + ",\t合计:" + this.totalPrice());
}
}
package com.demo.factory.model;
/**
* 抽象食物接口
*
* @author maofw
*
*/
public interface IFood
{
/**
* 打印输出食物信息
*/
void printMesage();
}
package com.demo.factory.model;
import com.demo.factory.model.Beverage;
import com.demo.factory.model.ChickenWings;
import com.demo.factory.model.FrenchFries;
import com.demo.factory.model.Hamburg;
/**
* 肯德基抽象工厂基类
*
* @author maofw
*
*/
public interface IKfcFactory
{
// 生产汉堡
public Hamburg createHamburg(int num);
// 生产薯条
public FrenchFries createFrenchFries(int num);
// 生产鸡翅
public ChickenWings createChickenWings(int num);
// 生产饮料
public Beverage createBeverage(int num);
}
肯德基店就是一个具体的工厂,这时,我们需要抽象一个工厂,在抽象工厂中指明了生产各种抽象食物的方法,如生产汉堡、鸡翅等,肯德基店就需要实现这个抽象工厂,生产具体的食品,如生产麻辣鸡腿汉堡、生产奥尔良鸡翅等。前面提到了“抽象食物”,我们还需要对每个具体的食物添加抽象父类,如汉堡就是抽象父类,麻辣鸡腿汉堡就是汉堡的一个子类,依次类推。这时,我们会发现,每一种食物又都存在着一些共同的属性,如风味、单价、数量等,因此,我们继续进行抽象,所有的抽象食物都继承一个抽象父类。客户如何订购肯德基生产的食物呢?这与上一章的工厂方法模式有所不同,这里我们使用组合的方式,将抽象工厂作为客户类中的一个实例变量,客户需要任何产品的时候,只需要向工厂请求即可,这就是抽象工厂模式的应用方式。客户类和工厂类分开,客户无须修改就可以获得新产品. 客户类中使用的都是抽象类和接口,这样即使生产再多的食物都不用担心了。
在抽象工厂模式中,定义了一个抽象接口,如本例中的IKfcFactory,之后具体工厂又通过实现抽象工厂的各种接口方法创建实例对象,如本例中的ChinaKfcFactory,这不正是之前讲的工厂方法模式吗?的确,在抽象工厂模式中使用了工厂方法模式的实现方式。