java实现简单KFC

一. 题目分析及要求

同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能:
1.正常餐品结算和找零。
2.基本套餐结算和找零。
3.使用优惠劵购买餐品结算和找零。
4.模拟打印小票的功能(写到文件中)。
基本要求:
1.实现功能测试代码,确保程序的健壮性。
2.画出使用的设计模式图。

二. 设计模式

单点食物
采用简单工厂模式,利用Java反射机制来实现食品类的实例化。
工厂类名 : ( SimFoodFactory )

套餐产品
采用抽象工厂模式,实现套餐系列产品的生成(三个)
工厂类名:(ComboOneFactory, ComboSecondFactory ,ComboThirdFactory )

三. 类图设计

在这里插入图片描述

四. 算法实现

1.实体类 Food

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Food {
public Integer id;
public String name;
public Double price;

public Integer getId(){
return id;

}
public String getName(){
return name;
}

public Double getPrice(){
return price;
}

}

2.Drink 类,Eat 类 继承 Food基类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class Eat extends Food {
public Float quality;

public Float getQuality(){
return quality;
}
@Override
public String toString(){
return "Eat{"+
"quality=" +quality+
", id="+ id +
", name='"+name +'\''+
", price="+price+
'}' ;


}}
3.单种食物,单种饮料分别继承Eat 及 Drink
如:①食物单品
public class ChipsItem extends Eat {
public ChipsItem() {
this.id=1006;
this.name="波纹霸王薯条";
this.price=12.0;
this.quality=50f;

}
}

②饮料单品
public class BeerItem extends Drink {
public BeerItem(){
this.id = 1004;
this.name = "百威啤酒";
this.price= 15.0;
this.capacity= 120f;
}
}

4.简单工厂,通过反射机制加载食物类实例(单点)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import kfc.order.item.Food;

/**
*
* 简单工厂,反射加载食物类实例(单点食物)
*/

public class SimFoodFactory {
public Food getFood(Class c){
try{
return (Food) Class.forName(c.getName()).newInstance();
}catch (InstantiationException | IllegalAccessException| ClassNotFoundException e){
e.printStackTrace();
}
return null;
}


}

5.套餐组合通过CombFactory 接口的实现来加载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
mport kfc.order.item.Food;

import java.util.List;

/**
* 抽象工厂,加载KFC组合套餐
*/
public interface CombFactory {
List<Food> getCombo();
}



具体一号套餐
import kfc.order.item.BeerItem;
import kfc.order.item.ChickenItem;
import kfc.order.item.Food;

import java.util.ArrayList;
import java.util.List;

/**
* 啤酒炸鸡 (1)号套餐
*/
public class ComboOneFactory implements CombFactory{
@Override
public List<Food> getCombo(){
List<Food> foodOneList= new ArrayList<Food>();//存储套餐产品
Food chick=new ChickenItem();//实例化套餐内的产品
Food beer =new BeerItem();
chick.price=chick.price-2;//套餐的优惠,炸鸡价格减2元
beer.price=beer.price-1;//套餐的优惠,啤酒价格减1元
foodOneList.add(chick);
foodOneList.add(beer);
return foodOneList;//返回套餐集合

}
}

6.FoodControler 类 通过函数处理具体点餐事务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import kfc.order.item.*;
import kfc.order.service.ComboOneFactory;
import kfc.order.service.ComboSecondFactory;
import kfc.order.service.ComboThirdFactory;
import kfc.order.service.SimFoodFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;


public class FoodControler {
static SimFoodFactory simFoodFactory = new SimFoodFactory();//简单工厂实例化
static List<Food> foodList = new ArrayList<>();

public void service(){
Scanner sc = new Scanner(System.in);

String choose = sc.nextLine();
switch (choose){
case "7":
foodList = new ComboOneFactory().getCombo();//抽象工厂产生套餐1
break;
case "8":
foodList = new ComboSecondFactory().getCombo();//抽象工厂产生套餐2
break;
case "9":
foodList = new ComboThirdFactory().getCombo();//抽象工厂产生套餐3
break;
case"1":
//香辣炸鸡
Food food_1= simFoodFactory.getFood(ChickenItem.class);//反射加载单品食物
foodList.add(food_1);
break;
case"2":
//香辣鸡腿堡
Food food_2 = simFoodFactory.getFood(HamburgerItem.class);
foodList.add(food_2);
break;
case"3":
//薯条
Food food_3 = simFoodFactory.getFood(ChipsItem.class);
foodList.add(food_3);
break;
case"4":
//美式
Food food_4 = simFoodFactory.getFood(CafeItem.class);
foodList.add(food_4);
break;
case"5":
//可乐
Food food_5 = simFoodFactory.getFood(CokeItem.class);
foodList.add(food_5);
break;
case"6":
//百威啤酒
Food food_6 = simFoodFactory.getFood(BeerItem.class);
foodList.add(food_6);
break;


default:
System.out.println("您所输入的点餐序号不存在");
foodList = new ArrayList();
}

}}

7.MainApp 类处理结算及顾客选择

1
其功能实现为其他类实例化对象当做方法参数使用

五. 测试截图

点餐界面截图

在这里插入图片描述

小票截图

在这里插入图片描述

六. 个人总结

Java Swing 可视化还未能掌握,因此此次程序设计只完成了基本要求。在程序编写中,对Java面向对象的思想有了更深的理解,也提升了编程中解决问题的能力。
在食物的实例化过程中,对建造者设计模式有了进一步的认识。同时对Java的反射机制有了一定的理解。

附 : 源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package kfc.order.item;

public class Food {
public Integer id;
public String name;
public Double price;

public Integer getId(){
return id;

}
public String getName(){
return name;
}

public Double getPrice(){
return price;
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package kfc.order.item;

public class Eat extends Food {
public Float quality;

public Float getQuality(){
return quality;
}
@Override
public String toString(){
return "Eat{"+
"quality=" +quality+
", id="+ id +
", name='"+name +'\''+
", price="+price+
'}' ;


}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package kfc.order.item;

public class Drink extends Food{
public Float capacity;

public Float getCapacity(){
return capacity;

}
@Override
public String toString(){
return "Drink{"+
"capacity=" +capacity+
", id="+ id +
", name='"+name +'\''+
", price="+price+
'}';

}
}
1
2
3
4
5
6
7
8
9
10
package kfc.order.item;

public class HamburgerItem extends Eat {
public HamburgerItem(){
this.id = 1001;
this.name = "香辣大虾堡";
this.price = 22.0;
this.quality = 10f;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
package kfc.order.item;

public class CokeItem extends Drink {
public CokeItem(){
this.id = 1003;
this.name ="可口可乐";
this.price = 11.0;
this.capacity = 200f;

}

}
1
2
3
4
5
6
7
8
9
10
11
package kfc.order.item;

public class ChipsItem extends Eat {
public ChipsItem() {
this.id=1006;
this.name="波纹霸王薯条";
this.price=12.0;
this.quality=50f;

}
}
1
2
3
4
5
6
7
8
9
10
11
12
package kfc.order.item;

public class ChickenItem extends Eat{
public ChickenItem(){
this.id = 1002;
this.name = "香辣鸡翅";
this.price = 48.0;
this.quality = 100f;

}

}
1
2
3
4
5
6
7
8
9
10
package kfc.order.item;

public class CafeItem extends Drink {
public CafeItem(){
this.id = 1005;
this.name ="美式咖啡";
this.price = 17.0;
this.capacity =100f;
}
}
1
2
3
4
5
6
7
8
9
10
package kfc.order.item;

public class BeerItem extends Drink {
public BeerItem(){
this.id = 1004;
this.name = "百威啤酒";
this.price= 15.0;
this.capacity= 120f;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
package kfc.order.service;

import kfc.order.item.Food;

import java.util.List;

/**
* 抽象工厂,加载KFC组合套餐
*/
public interface CombFactory {
List<Food> getCombo();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package kfc.order.service;

import kfc.order.item.BeerItem;
import kfc.order.item.ChickenItem;
import kfc.order.item.Food;

import java.util.ArrayList;
import java.util.List;

/**
* 啤酒炸鸡 (1)号套餐
*/
public class ComboOneFactory implements CombFactory{
@Override
public List<Food> getCombo(){
List<Food> foodOneList= new ArrayList<Food>();//存储套餐产品
Food chick=new ChickenItem();//实例化套餐内的产品
Food beer =new BeerItem();
chick.price=chick.price-2;//套餐的优惠,炸鸡价格减2元
beer.price=beer.price-1;//套餐的优惠,啤酒价格减1元
foodOneList.add(chick);
foodOneList.add(beer);
return foodOneList;//返回套餐集合

}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package kfc.order.service;

import kfc.order.item.CafeItem;
import kfc.order.item.Food;
import kfc.order.item.HamburgerItem;

import java.util.ArrayList;
import java.util.List;

/**
* 咖啡和汉堡 (2)号套餐
*/

public class ComboSecondFactory implements CombFactory {
public List<Food> getCombo(){
List<Food> foodSecondList= new ArrayList<Food>();
Food ham = new HamburgerItem();
Food cafe= new CafeItem();
ham.price = ham.price-1;//套餐组合的优惠 汉堡减一元
cafe.price = cafe.price-0.5;//套餐组合的优惠 咖啡减0.5元
foodSecondList.add(cafe);
foodSecondList.add(ham);
return foodSecondList;

}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package kfc.order.service;

import kfc.order.item.ChipsItem;
import kfc.order.item.CokeItem;
import kfc.order.item.Food;

import java.util.ArrayList;
import java.util.List;

/**
* 可乐和薯条 (3)号套餐
*/
public class ComboThirdFactory implements CombFactory {
@Override
public List<Food> getCombo() {
List<Food> foodThreeList = new ArrayList<Food>();
Food chips = new ChipsItem();
Food cola = new CokeItem();
cola.price = cola.price - 1;//套餐组合的优惠
chips.price = chips.price - 0.5;
foodThreeList.add(chips);
foodThreeList.add(cola);
return foodThreeList;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package kfc.order.service;

import kfc.order.item.Food;

/**
*
* 简单工厂,反射加载食物类实例(单点食物)
*/

public class SimFoodFactory {
public Food getFood(Class c){
try{
return (Food) Class.forName(c.getName()).newInstance();
}catch (InstantiationException | IllegalAccessException| ClassNotFoundException e){
e.printStackTrace();
}
return null;
}


}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package kfc.order.control;

import kfc.order.item.*;
import kfc.order.service.ComboOneFactory;
import kfc.order.service.ComboSecondFactory;
import kfc.order.service.ComboThirdFactory;
import kfc.order.service.SimFoodFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;


public class FoodControler {
static SimFoodFactory simFoodFactory = new SimFoodFactory();//简单工厂实例化
static List<Food> foodList = new ArrayList<>();

public void service(){
Scanner sc = new Scanner(System.in);

String choose = sc.nextLine();
switch (choose){
case "7":
foodList = new ComboOneFactory().getCombo();//抽象工厂产生套餐1
break;
case "8":
foodList = new ComboSecondFactory().getCombo();//抽象工厂产生套餐2
break;
case "9":
foodList = new ComboThirdFactory().getCombo();//抽象工厂产生套餐3
break;
case"1":
//香辣炸鸡
Food food_1= simFoodFactory.getFood(ChickenItem.class);
foodList.add(food_1);
break;
case"2":
//香辣鸡腿堡
Food food_2 = simFoodFactory.getFood(HamburgerItem.class);
foodList.add(food_2);
break;
case"3":
//薯条
Food food_3 = simFoodFactory.getFood(ChipsItem.class);
foodList.add(food_3);
break;
case"4":
//美式
Food food_4 = simFoodFactory.getFood(CafeItem.class);
foodList.add(food_4);
break;
case"5":
//可乐
Food food_5 = simFoodFactory.getFood(CokeItem.class);
foodList.add(food_5);
break;
case"6":
//百威啤酒
Food food_6 = simFoodFactory.getFood(BeerItem.class);
foodList.add(food_6);
break;


default:
System.out.println("您所输入的点餐序号不存在");
foodList = new ArrayList();
}



}}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package kfc.order.control;

import kfc.order.item.Food;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import java.util.List;


public class MoneyAnalyze {
public Double getMoneyCount(List<Food> list ){//,Double disCount,Double tickets){
Double moneyCount = 0.0; //顾客应付钱数
for (Food food:list){
moneyCount += food.price;

}//return moneyCount*disCount-tickets; //计算折扣后应付钱数
return moneyCount;
}

/**
* 找零
* @param inMoney 收入的钱数
* @param count 应收钱数
*/
public Double getChange( Double inMoney,Double count){
return inMoney-count;
}
/**
* 打印小票
*
*/
public void receipt(List<Food>list ,Double disCount,Double tickets) throws IOException{

Date currentTime = new Date();

FileWriter fileWriter= new FileWriter("receipt.txt");
BufferedWriter bw = new BufferedWriter(fileWriter);
bw.write("————————————————————欢迎光临 **有点LOW** KFC————————————————"+"\r\n");
bw.write("\n\n");
bw.write("订单时间:"+currentTime+"\r\n\n");
bw.write("您本次消费清单如下"+"\r\n");
for (Food food:list){
bw.write("ID:"+food.id+"\r\n");
bw.write("食物:"+food.name+"\r\n");
bw.write("金额:"+food.price+"\r\n");
}
bw.write("折扣"+disCount*10 +"折"+"\r\n");
bw.write("优惠"+tickets+"元"+"\r\n");
bw.write("总金额"+((getMoneyCount(list)*disCount)-tickets)+ "\u5143");
bw.flush();
bw.close();

}


}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
package kfc.order.control;

import java.io.IOException;
import java.util.Scanner;

public class MainApp {
public static Double tickets=0.0 ;
public static Double disCount=1.0;
MoneyAnalyze moneyAnalyze = new MoneyAnalyze();
static FoodControler foodControler = new FoodControler();


public void interFace()throws IOException{
System.out.println("============================================================");
System.out.println("************************************************************\n");
System.out.println("--------------------欢迎光临KFC------------------------------");
System.out.println("************** 1.点餐 \n");
System.out.println("************** 2.领取优惠卷 (请在购买商品之后查看领取哦) \n");
System.out.println("************** 3.结算 \n");
System.out.println("*************************************************************\n");
System.out.println("=============================================================");
System.out.println("请选择服务类型:");
chooseServe();
}
public void chooseServe() throws IOException {
Scanner sc = new Scanner(System.in);
String inter =sc.nextLine();
while (true){
if(inter.equals("1")){
orderMeal();

break;
}
else if(inter.equals("2")){
System.out.println("满50减3.6元");
System.out.println("满80减5.0元");
System.out.println("请选择服务类型:");
chooseServe();
break;
}
else if(inter.equals("3")){
if(foodControler.foodList!=null){
settlement();
break;}
else {
System.out.println("您当前还未点餐,结算系统锁定,请点餐后选择");
chooseServe();
}
}else {
System.out.println("服务类型不存在,我们正在完善中,请您重新选择 ");
chooseServe();
break;
}}
}
public void orderMeal() throws IOException {
System.out.println("\n");
System.out.println("---------------- 本店推出以下菜品:--------------------------");
System.out.println("① 自选单品");
System.out.println("1. 香辣鸡翅:48元/份 2. 香辣大虾堡:22元/个");
System.out.println("3. 波纹霸王薯条: 12元/份 4. 美式咖啡:17元/杯 ");
System.out.println("5. 可口可乐:11元/杯 6. 百威啤酒:15元/杯 " );
System.out.println("② 人气套餐——有优惠哦");
System.out.println("7. 套餐一:啤酒+炸鸡:60元/份");
System.out.println("8. 套餐二:汉堡+咖啡:37.5元/份");
System.out.println("9. 套餐三:可乐+薯条:21.5元/份");
System.out.println("--------------------------------------------------------------");
System.out.println("请选择餐品序号");

//调用FoodControler 函数Server()
// FoodControler foodControler =new FoodControler();
while(true){

foodControler.service();

System.out.println("您所点的商品如下 :");
System.out.println(foodControler.foodList);
System.out.println("您当前订单金额为:"+moneyAnalyze.getMoneyCount(foodControler.foodList)+"元");
// System.out.println(foodControler.foodList.isEmpty());//测试列表空否
chooseQuit();
break;


}

}
public void chooseQuit() throws IOException {//点餐界面离开选项
System.out.println("继续:【Y】 结算:【S】 返回【A】");
System.out.println("请输入服务类型:");
Scanner sc = new Scanner(System.in);
String item =sc.nextLine();
while (true) {
if (item.equals("A") || item.equals("a")) {
interFace();
break;
} else if (item.equals("Y") || item.equals("y")) {

System.out.println(foodControler.foodList);
// System.out.println("您当前订单金额为:"+moneyAnalyze.getMoneyCount(foodControler.foodList));

orderMeal();
break;
} else if (item.equals("S") || item.equals("s")) {
settlement();
break;


} else {
System.out.println("您所选择的服务不存在,请重新输入:");
chooseQuit();
break;
}
}
}
public void getTickets(){

if(moneyAnalyze.getMoneyCount(foodControler.foodList)<50){
System.out.println("您的订单无法领取优惠券");
}
if(moneyAnalyze.getMoneyCount(foodControler.foodList)>50&&moneyAnalyze.getMoneyCount(foodControler.foodList)<80){
tickets=3.6;
System.out.println("您的订单可以领取3.6元优惠券");
}else if(moneyAnalyze.getMoneyCount(foodControler.foodList)>80){
tickets=5.0;
System.out.println("您的订单可以领取5元优惠券");
}

}

/**
* 通过消费判定折扣
*/
public void settlement() throws IOException {

System.out.println("您的付款金额:");
Scanner sc = new Scanner(System.in);
Double inMoney = sc.nextDouble();

if(moneyAnalyze.getMoneyCount(foodControler.foodList)>50){
//tickets= 3.6;
disCount=0.86;
}else if(moneyAnalyze.getMoneyCount(foodControler.foodList)>80){
//tickets=5;
disCount=0.75;
}

System.out.println("您本次消费如下:");
getTickets();
System.out.println("您本次消费:"+moneyAnalyze.getMoneyCount(foodControler.foodList));

System.out.println("优惠:"+tickets+" 元");
System.out.println("折扣:"+disCount*10+" 折");
System.out.println("折后消费:"+(moneyAnalyze.getMoneyCount(foodControler.foodList)*disCount));
System.out.println("收您:"+inMoney+" 元");

System.out.println("找零:"+(moneyAnalyze.getChange(inMoney,moneyAnalyze.getMoneyCount(foodControler.foodList)*disCount-tickets))+" 元");

moneyAnalyze.receipt(foodControler.foodList,disCount,tickets);//调用函数打印小票

}



}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package kfc.order.control;
import java.io.IOException;



public class StartKFC {

public static void main(String[] args) throws IOException {
MainApp mainApp = new MainApp();

mainApp.interFace();




}
}
//工厂模式算法源自CSDN 博客
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2020 卻水
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信