KFC收银系统
题目:
同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息,模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式至少实现系统的以下功能:
- 正常餐品结算和找零。
- 基本套餐结算和找零。
- 使用优惠券购买餐品结算和找零。
- 可在一定时间段参与店内活动(自行设计或参考官网信息)。
- 模拟打印小票的功能(写到文件中)。
分析:
运用抽象工厂模式:
- 一个具体工厂负责一种类型食物的创建。汉堡类工厂制造汉堡,鸡翅类工厂制造鸡翅,薯条类工厂制作薯条,饮料类工厂制作饮料。
- KFC抽象类工厂负责接收客户需要的食物的种类和数量即可。
- 接下来由KFC店卖的只是不同食物的不同类型(比如:汉堡有牛肉汉堡,鸡肉汉堡....饮料有可乐,橙汁....)。
- 再创建一个顾客类,用来接收顾客的点单信息,然后将信息传给KFC抽象类工厂。
这样就完成了一次点餐。
具体实现:
- PintFood是用来打印出消费信息的接口,由各类不同的食品工厂来实现它。
- BaseFood抽象类用来定义食品的种类,数量,价格和最终的合计。
- Hamburg,ChickenWing,FrenchFrich,Drink分别为抽象类的汉堡,鸡翅,薯条和饮料,也就是各种食物的基类,由AchieveHamburg,AchieveChickenWing,AchieveFrenchFrich,AchieveDrink这些具体的实现类来实现它的各种信息。
- 建立抽象类工厂AbstractKFCFactory生产不同种类的食物。
- KFCFactory类用来实现抽象类工厂AbstractKFCFactory。
- 又构建一个套餐类kfcPackage,定义套餐的种类,价格和数量。
- TaoCanFactory1,TaoCanFactory2是用来实现具体的套餐类。
- 抽象类kfcBuilder是用来接收客户的需求从而转入相应的具体套餐类。
- Director类用来打印套餐的消费信息。
- 顾客类Customer实现食物的选择。
- 最后主类mainClass用来将整个程序串起来实现点餐,结算和打印小票。
类图:
运行过程:
- 显示套餐信息,先了解顾客需不需要套餐,需要输入9,不需要输入0.
2.假如需要套餐输入9,然后会问需要哪个套餐,有套餐1和套餐2。假如选套餐2。
选了套餐2后会直接显示套餐中都有什么食物,然后就是进行结账。
3.结账完后打印出小票。
小票:
4.当没有选套餐是(输入0后),进入客户选择视频模式。
我设置了只有在顾客自定义选餐的情况下才可以参与打折等优惠活动,在套餐情况下不参与打折。
小票:
源代码:
用来打印出消费信息的接口
package KFC;
//食物接口
public interface PrintFood {
//打印出消费信息
public void printConsumptionMessage();
}
用来定义食品的种类,数量,价格和最终的合计
package KFC;
public abstract class BaseFood {
//定义餐品价格
protected double price;
//定义餐品数量
protected int num;
//定义物品种类
protected String kind;
//计算消费总金额
public double totalPrice(){
return this.price*this.num;
}
}
package KFC;
//定义汉堡类基类
public abstract class Hamburg extends BaseFood implements PrintFood{
@Override
public void printConsumptionMessage() {
System.out.println(this.kind+"汉堡:\t单价"+this.price+" \t数量:"+this.num);
}
}
具体实现的汉堡类
package KFC;
public class AchieveHamburg extends Hamburg{
public AchieveHamburg(int kind,int num) {
switch(kind) {
case 1:
this.kind = "芝士蛋";
this.price = 16.0;
break;
case 2:
this.kind = "鸡肉";
this.price = 12.0;
break;
case 3:
this.kind = "新奥尔良";
this.price = 20.0;
break;
}
this.num = num;
}
}
package KFC;
//定义鸡翅类基类
public abstract class ChickenWings extends BaseFood implements PrintFood{
@Override
public void printConsumptionMessage() {
System.out.println(this.kind+"鸡翅:\t单价"+this.price+" \t数量:"+this.num);
}
}
具体实现鸡翅类
package KFC;
//香辣鸡翅
public class AchieveChickenWings extends ChickenWings{
public AchieveChickenWings(int num) {
this.kind = "香辣";
this.price = 23.0;
this.num = num;
}
}
package KFC;
//定义薯条类基类
public abstract class FrenchFries extends BaseFood implements PrintFood{
@Override
public void printConsumptionMessage() {
System.out.println(this.kind+"薯条:\t单价"+this.price+" \t数量:"+this.num);
}
}
具体实现薯条类
package KFC;
public class AchieveFrenchFries extends FrenchFries{
public AchieveFrenchFries(int num) {
this.kind = "番茄味";
this.price = 16.0;
this.num = num;
}
}
package KFC;
//饮料基类
public abstract class Drink extends BaseFood implements PrintFood{
public void printConsumptionMessage() {
System.out.println(this.kind+"饮品:\t单价"+this.price+" \t数量:"+this.num);
}
}
具体实现饮料类
package KFC;
//
public class AchieveDrink extends Drink{
public AchieveDrink(int kind,int num) {
switch(kind) {
case 1:
this.kind = "可乐";
this.price = 7.0;
break;
case 2:
this.kind = "橙汁";
this.price = 12.0;
break;
case 3:
this.kind = "柠檬水";
this.price = 5.0;
break;
case 4:
this.kind = "雪碧";
this.price = 7.0;
break;
}
this.num = num;
}
}
套餐:
package KFC;
public class Director {
//套餐1的应用
private static KfcBuilder taocanFactoey1 = new TaoCanFactory1();
//套餐2的应用
private static KfcBuilder taocanFactory2 = new TaoCanFactory2();
//生产套餐一
public static KfcPackage getTaoCanFactory1() {
return taocanFactoey1.getKfcPackage();
}
//生产套餐二
public static KfcPackage getTaoCanFactory2() {
return taocanFactory2.getKfcPackage();
}
}
package KFC;
public abstract class KfcBuilder {
protected final KfcPackage kfcpackage = new KfcPackage();
//套餐的种类
public void setKind(String kind) {
this.kfcpackage.setKind(kind);
}
//套餐的价格
public void setPrice(double price) {
this.kfcpackage.setPrice(price);
}
//套餐的数量
public void setNum(int num) {
this.kfcpackage.setNum(num);
}
//构造一个完整的套餐
public abstract KfcPackage getKfcPackage();
}
package KFC;
/*套餐,用建造者模式*/
public class KfcPackage {
//定义餐品价格
protected double price;
//定义餐品数量
protected int num;
//定义套餐种类
protected String kind;
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getKind() {
return kind;
}
public void setKind(String kind) {
this.kind = kind;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public void printFood() {
System.out.println(kind+"\t 单价:"+price+"\t 数量:"+num);
}
}
package KFC;
public class TaoCanFactory1 extends KfcBuilder{
public KfcPackage getKfcPackage() {
super.kfcpackage.setKind("牛肉汉堡、香辣鸡翅、薯条、橙汁 ");
super.kfcpackage.setNum(1);
super.kfcpackage.setPrice(50.0);
return super.kfcpackage;
}
}
package KFC;
public class TaoCanFactory2 extends KfcBuilder{
public KfcPackage getKfcPackage() {
super.kfcpackage.setKind("七虾汉堡、烧烤鸡翅、薯条、可乐");
super.kfcpackage.setNum(1);
super.kfcpackage.setPrice(60.0);
return super.kfcpackage;
}
}
package KFC;
public class KFCFactory implements AbstractKFCFactory{
public Hamburg createHamburg(int kind,int num ) {
switch(kind) {
case 1:
return new AchieveHamburg(1,num);
case 2:
return new AchieveHamburg(2,num);
case 3:
return new AchieveHamburg(3,num);
}
return null;
}
public ChickenWings createChickenWings(int num) {
return new AchieveChickenWings(num);
}
public FrenchFries createFrenchFries(int num) {
return new AchieveFrenchFries(num);
}
public Drink createDrink(int kind,int num) {
switch(kind) {
case 1:
return new AchieveDrink(1,num);
case 2:
return new AchieveDrink(2,num);
case 3:
return new AchieveDrink(3,num);
case 4:
return new AchieveDrink(4,num);
}
return null;
}
}
package KFC;
public interface AbstractKFCFactory {
//生产汉堡
public Hamburg createHamburg(int kind,int num);
//生产鸡翅
public ChickenWings createChickenWings(int num);
//生产薯条
public FrenchFries createFrenchFries(int num);
//生产饮品
public Drink createDrink(int kind,int num);
}
package KFC;
//顾客类
public class Customer {
private AbstractKFCFactory kfcFactory;
public Customer(AbstractKFCFactory kfcFactory) {
this.kfcFactory = kfcFactory;
}
//购买汉堡
public double orderHamburg(int kind,int num) {
//获得汉堡
Hamburg hamburg = kfcFactory.createHamburg(kind,num);
//打印购买信息
hamburg.printConsumptionMessage();
//返回总消费
return hamburg.totalPrice();
}
//购买鸡翅
public double orderChickenWings(int num) {
//获得鸡翅
ChickenWings chicken = kfcFactory.createChickenWings(num);
//打印购买信息
chicken.printConsumptionMessage();
//返回总消费
return chicken.totalPrice();
}
//购买薯条
public double orederFrenchFrices(int num) {
//获得薯条
FrenchFries frenchfrice = kfcFactory.createFrenchFries(num);
//打印购买信息
frenchfrice.printConsumptionMessage();
//返回总消费
return frenchfrice.totalPrice();
}
//购买饮品
public double orderDrink(int kind,int num) {
//获得饮品
Drink drink = kfcFactory.createDrink(kind,num);
//打印购买信息
drink.printConsumptionMessage();
//返回总消费
return drink.totalPrice();
}
}
package KFC;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class mainClass {
public static void main(String[] args) {
System.out.println("本店提供的套餐如下:");
KfcPackage taocanFactory1 = Director.getTaoCanFactory1();
System.out.println("套餐一:");
System.out.println(taocanFactory1.getKind());
System.out.println("价格:"+taocanFactory1.getPrice());
//生产套餐二
KfcPackage taocanFatory2 = Director.getTaoCanFactory2();
System.out.println("套餐二:");
System.out.println(taocanFatory2.getKind());
System.out.println("价格:"+taocanFatory2.getPrice());
Scanner scan = new Scanner(System.in);
System.out.println("请选择是否订购套餐,是 请输入9,否 输入0");
int num = scan.nextInt();
if(num == 9 ) {
System.out.println("请选择你选则的套餐:1:套餐一 2:套餐二");
int number = scan.nextInt();
if( number == 1) {
System.out.println("------------------账单------------------");
AbstractKFCFactory akfcFoctory = new KFCFactory();
//套餐1
System.out.println(taocanFactory1.getKind());
System.out.println("价格:"+taocanFactory1.getPrice()+"\t 数量:"+taocanFactory1.getNum());
System.out.println("累计消费:"+(taocanFactory1.getPrice()*taocanFactory1.getNum())+"元");
System.out.println("----------------------------------------");
System.out.println("用户支付金额:");
int money = scan.nextInt();
System.out.println("找零钱"+(money-taocanFactory1.getPrice()*taocanFactory1.getNum())+"元");
System.out.println("打印小票");
Date d=new Date();
SimpleDateFormat day=new SimpleDateFormat("yy-MM-dd HH:mm:ss");
try{
FileWriter fw = new FileWriter("Consumption.txt", true);
fw.write("--------欢迎光临肯德基:-------"+"\r\n");
fw.write("------------------------------"+"\r\n");
fw.write("---当前订单产生时间为:"+day.format(d)+"\r\n");
fw.write("---套餐:牛肉汉堡,香辣鸡翅,薯条,橙汁"+"\r\n");
fw.write("---套餐不参与打折"+"\r\n");
fw.write("---应付价钱:"+50+"\r\n");
fw.write("---实付价钱:"+money+"\r\n");
fw.write("---找零:"+(money-50)+"\r\n");
fw.write("------------------------------"+"\r\n");
fw.write("----谢谢惠顾!期待您的再次光临!"+"\r\n");
fw.close();
} catch (IOException a){
a.printStackTrace();
}
}
else{
System.out.println("------------------账单------------------");
AbstractKFCFactory akfcFoctory = new KFCFactory();
//套餐2
System.out.println(taocanFatory2.getKind());
System.out.println("价格:"+taocanFatory2.getPrice()+"\t 数量:"+taocanFatory2.getNum());
System.out.println("累计消费:"+(taocanFatory2.getPrice()*taocanFatory2.getNum())+"元");
System.out.println("----------------------------------------");
System.out.println("用户支付金额:");
int money = scan.nextInt();
System.out.println("找零钱"+(money-taocanFatory2.getPrice()*taocanFatory2.getNum())+"元");
System.out.println("打印小票");
Date d=new Date();
SimpleDateFormat day=new SimpleDateFormat("yy-MM-dd HH:mm:ss");
try{
FileWriter fw = new FileWriter("Consumption.txt", true);
fw.write("-------欢迎光临肯德基:-------"+"\r\n");
fw.write("------------------------------"+"\r\n");
fw.write("---当前订单产生时间为:"+day.format(d)+"\r\n");
fw.write("---套餐:七虾汉堡,烧烤鸡翅,薯条,可乐"+"\r\n");
fw.write("---套餐不参与打折"+"\r\n");
fw.write("---应付价钱:"+60+"\r\n");
fw.write("---实付价钱:"+money+"\r\n");
fw.write("---找零:"+(money-60)+"\r\n");
fw.write("------------------------------"+"\r\n");
fw.write("----谢谢惠顾!期待您的再次光临!"+"\r\n");
fw.close();
} catch (IOException a){
a.printStackTrace();
}
}
}
else {
//System.out.println("------------------账单------------------");
AbstractKFCFactory akfcFoctory = new KFCFactory();
//顾客点餐
//创建顾客对象
Customer customer = new Customer(akfcFoctory);
//汉堡
System.out.println("顾客需要什么口味的汉堡:1:芝士蛋 2:鸡肉 3:新奥尔良 以及需要汉堡的个数:");
int Kind = scan.nextInt();
int Hnum = scan.nextInt();
double hamburgCost = customer.orderHamburg(Kind,Hnum);
//鸡翅
System.out.println("顾客需要鸡翅的个数:");
int Jnum= scan.nextInt();
double chickenWingsCost = customer.orderChickenWings(Jnum);
//薯条
System.out.println("顾客需要薯条的个数:");
int Snum = scan.nextInt();
double frenchFriesCost = customer.orederFrenchFrices(Snum);
//饮料
System.out.println("顾客需要什么口味的饮料:1:可乐 2:橙汁 3:柠檬水 4:雪碧 以及需要几杯饮料:");
int kind = scan.nextInt();
int Knum = scan.nextInt();
double drinkCost = customer.orderDrink(kind,Knum);
System.out.println("是否有优惠券,有,输入可打多少折;没有输 1");
float discount = scan.nextFloat();
System.out.println("累计消费:"+((hamburgCost+chickenWingsCost+frenchFriesCost+drinkCost)*discount)+"元");
System.out.println("----------------------------------------");
System.out.println("用户支付金额:");
int money = scan.nextInt();
System.out.println("找零钱"+(money-(hamburgCost+chickenWingsCost+frenchFriesCost+drinkCost)*discount)+"元");
System.out.println("打印小票");
Date d=new Date();
SimpleDateFormat day=new SimpleDateFormat("yy-MM-dd HH:mm:ss");
try{
FileWriter fw = new FileWriter("Consumption.txt", true);
fw.write("-------欢迎光临肯德基:-------"+"\r\n");
fw.write("------------------------------"+"\r\n");
fw.write("---当前订单产生时间为:"+day.format(d)+"\r\n");
fw.write("---您点的汉堡:"+Kind+"\t"+Hnum+"个"+"\t应付"+hamburgCost+"元"+"\r\n");
fw.write("---您点的香辣鸡翅:"+Jnum+"份"+"\t应付"+(chickenWingsCost)+"元"+"\r\n");
fw.write("---您点的香辣薯条:"+Snum+"包"+"\t应付"+(frenchFriesCost)+"元"+"\r\n");
fw.write("---您点的饮料:"+kind+"\t"+Hnum+"杯"+"\t应付"+hamburgCost+"元"+"\r\n");
fw.write("---应付价钱:"+hamburgCost+chickenWingsCost+frenchFriesCost+drinkCost+"\r\n");
fw.write("---实付价钱:"+money+"\r\n");
if(discount==1)
fw.write("---由于您没有折扣优惠券"+"\r\n");
else
fw.write("---由于您拥有"+discount*10+"折扣的优惠券"+"\r\n");
fw.write("---您最终应付价格为:"+(hamburgCost+chickenWingsCost+frenchFriesCost+drinkCost)*discount+"\r\n");
fw.write("------------------------------"+"\r\n");
fw.write("---谢谢惠顾!期待您的再次光临!"+"\r\n");
fw.close();
} catch (IOException a){
a.printStackTrace();
}
}
}
}