一. 题目内容
同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能:
1.正常餐品结算和找零。
2.基本套餐结算和找零。
3.使用优惠劵购买餐品结算和找零。
4.可在一定时间段参与店内活动(自行设计或参考官网信息)。
5.模拟打印小票的功能(写到文件中)。
基本要求:
1.程序设计风格良好,控制台界面友好,最多两人一组完成任务。
2.实现功能测试代码,确保程序的健壮性。
3.画出使用的设计模式图。
提高要求:
1.实现可视化界面(使用MFC)。
2.实现会员储值卡功能,完成储值卡消费。
3.实现当天营业额和餐品销量计算和统计,用数据库记录
二.算法设计
采用抽象工厂模式和工厂方法模式。
抽象工厂模式:写一个抽象食物基类(KFC),然后写抽象食物类如汉堡(Humberger)、薯条(Frenchfries)等继承食物基类并且实现打印接口(Food),再实现抽象具体食物类(ChinaHumberger、ChinaFrenchfries等)。
工厂方法模式:写一个工厂接口(Factory),由这个工厂生产各个食物,在实现工厂接口用来具体生产食物。由顾客来调用工厂生产食物和模拟打印小票。
类图
三.测试、调试
1.调试
2.测试
四.总结
这次作业花费了很长的时间,刚开始做的时候对于设计模式并没有太多的了解,第一个用的就是简单工厂模式,随后在课堂上跟着老师重点学习了几种重要的设计模式后才理解了简单工厂模式的弊端,然后就把起初写的简单工厂模式换了,在这次作业中用了抽象工厂模式和工厂方法模式。在CSDN上参考了很多优秀的代码,有的前辈采用的是JAVA的GUI写的,有的则是MFC,由于对GUI不是很了解,MFC又忘记了很多,所以就没有使用界面设计。这次作业目前为止只实现了基本功能,提高要求还没有实现,在接下来的时间里,我会学习一下GUI的使用,并优化功能,争取实现一个完整的KFC收银系统。
五.部分代码
抽象食物基类
package KFC;
public class KFC{
protected String kind;
protected float price;
protected int num;
public float totalPrice()
{
return this.num * this.price;
}
}
抽象工厂基类
package KFC;
public interface Factory{//抽象工厂基类
// 生产汉堡
public Humberger createHumberger(int num);
// 生产薯条
public FrenchFries createFrenchFries(int num);
// 生产鸡翅
public ChickenWings createChickenWings(int num);
// 生产饮料
public Beverage createBeverage(int num);
// 生产套餐1
public TC1 createTC1(int num);
// 生产套餐2
public TC2 createTC2(int num);
}
接口Food
package KFC;
public interface Food {
String printMesage();
}
抽象食物类
package KFC;
public abstract class Humberger extends KFC implements Food{//汉堡基类
public String printMesage(){
return("--"+this.kind+"风味汉堡,\t单价:"+this.price+",\t数量:"+this.num+",\t合计:"+this.totalPrice());
}
}
具体食物类
public class ChinaHumberger extends Humberger {//汉堡实现类
public ChinaHumberger(int num)
{
this.kind = "麻辣";
this.price = 14.0f;
this.num = num;
}
}
客户类
package KFC;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.text.ParseException;
import java.io.IOException;
public class Client {//客户类
// 抽象工厂
private Factory Factory;
// 构造方法将抽象工厂作为参数传入
public Client(Factory Factory)
{
this.Factory = Factory;
}
private String s[] =new String[6];
private BufferedWriter bw;
public void showbill() throws IOException,ParseException{
bw=new BufferedWriter(new FileWriter("KFC.txt",true));
bw.write("---------------------账单如下---------------------");
bw.newLine();
for(int i=0;i<6;i++){
bw.write(s[i]);
bw.newLine();
bw.flush();
}
}
// 订购麻辣鸡腿汉堡
public float orderHumberger(int num) {
// 获得麻辣鸡腿汉堡
Humberger humberger = Factory.createHumberger(num);
// 输出订购信息
System.out.print(humberger.printMesage());
s[0]=humberger.printMesage();
System.out.print("\n");
// 返回总价
return humberger.totalPrice();
}
// 订购奥尔良烤鸡翅
public float orderChickenWings(int num){
// 获得奥尔良烤鸡翅
ChickenWings chickenWings = Factory.createChickenWings(num);
// 输出订购信息
System.out.print(chickenWings.printMesage());
s[1]=chickenWings.printMesage();
System.out.print("\n");
// 返回总价
return chickenWings.totalPrice();
}
// 订购薯条
public float orderFrenchFries(int num)
{
// 获得薯条
FrenchFries frenchFries = Factory.createFrenchFries(num);
// 输出订购信息
System.out.print(frenchFries.printMesage());
s[2]=frenchFries.printMesage();
System.out.print("\n");
// 返回总价
return frenchFries.totalPrice();
}
// 订购可乐
public float orderBeverage(int num)
{
// 获得可乐
Beverage beverage = Factory.createBeverage(num);
// 输出订购信息
System.out.print(beverage.printMesage());
s[3]=beverage.printMesage();
System.out.print("\n");
return beverage.totalPrice();
}
//订购套餐1
public float orderTC1(int num)
{
// 获得麻辣鸡腿汉堡
Humberger humberger = Factory.createHumberger(num);
// 获得奥尔良烤鸡翅
ChickenWings chickenWings = Factory.createChickenWings(num);
// 获得可乐
Beverage beverage = Factory.createBeverage(num);
s[4]=("--套餐1:汉堡+鸡翅+可乐 ,\t单价:21,\t数量:"+num+"\t\t合计:"+(chickenWings.totalPrice()+beverage.totalPrice()+humberger.totalPrice())+"\n");
System.out.print("--套餐1:汉堡+鸡翅+可乐 ,\t单价:21,\t数量:"+num+"\t\t合计:"+(chickenWings.totalPrice()+beverage.totalPrice()+humberger.totalPrice())+"\n");
return (chickenWings.totalPrice()+beverage.totalPrice()+humberger.totalPrice());
}
// 订购套餐2
public float orderTC2(int num)
{
// 获得麻辣鸡腿汉堡
Humberger humberger = Factory.createHumberger(num);
// 获得薯条
FrenchFries frenchFries = Factory.createFrenchFries(num);
// 获得可乐
Beverage beverage = Factory.createBeverage(num);
s[5]=("--套餐2:汉堡+薯条+可乐 ,\t单价:26.5,\t数量:"+num+"\t\t合计:"+(frenchFries.totalPrice()+beverage.totalPrice()+humberger.totalPrice())+"\n");
System.out.print("--套餐1:汉堡+薯条+可乐 ,\t单价:26.5,\t数量:"+num+"\t\t合计:"+(frenchFries.totalPrice()+beverage.totalPrice()+humberger.totalPrice())+"\n");
return (frenchFries.totalPrice()+beverage.totalPrice()+humberger.totalPrice());
}
}
测试类
package KFC;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.text.ParseException;
import java.io.IOException;
import java.util.Scanner;
import KFC.Factory;
import KFC.Client;
public class text {
private static Scanner sc;
public static void main(String[] args) throws IOException ,ParseException{
Factory Factory = new ChinaFactory();
Client client = new Client(Factory);
float total=0;
float humbergerMoney = 0;
float frenchFriesMoney =0;
float chickenWingsMoney =0;
float beverageMoney =0;
float tc1Money =0;
float tc2Money =0;
System.out.println("==============================");
System.out.println("------------------------------");
System.out.println("********欢迎来到KFC********");
System.out.println("*********本店推出以下产品:*********");
System.out.println("1.麻辣鸡腿汉堡:14/个");
System.out.println("2.普通风味薯条:8/份");
System.out.println("3.奥尔良鸡翅:2.5/个");
System.out.println("4.可乐:7/杯");
System.out.println("5.套餐1:汉堡+鸡翅+可乐:21/份");
System.out.println("6.套餐2:汉堡+薯条+可乐:26.5/份");
System.out.println("------------------------------");
System.out.println("==============================");
System.out.println("请点餐:");
sc=new Scanner(System.in);
System.out.println("请输入 麻辣鸡腿汉堡 数量:");
int a1=sc.nextInt();
System.out.println("请输入 薯条 数量:");
int a2=sc.nextInt();
System.out.println("请输入 鸡翅 数量:");
int a3=sc.nextInt();
System.out.println("请输入 可乐 数量:");
int a4=sc.nextInt();
System.out.println("请输入 套餐1:汉堡+鸡翅+可乐 数量:");
int a5=sc.nextInt();
System.out.println("请输入 套餐2:汉堡+薯条+可乐 数量:");
int a6=sc.nextInt();
System.out.print("\n----------------------账单如下---------------------\n");
humbergerMoney = client.orderHumberger(a1);
frenchFriesMoney = client.orderFrenchFries(a2);
chickenWingsMoney = client.orderChickenWings(a3);
beverageMoney = client.orderBeverage(a4);
tc1Money=client.orderTC1(a5);
tc2Money=client.orderTC2(a6);
total=humbergerMoney + chickenWingsMoney + frenchFriesMoney + beverageMoney+tc1Money+tc2Money;
client.showbill();
System.out.println("共计:" +total);
int r=0;
if (total >= 20) {
r=5;
}
else if (total >= 50) {
r=20;
}
else {
r=0;
}
System.out.println("请输入实付金额:");
int t=sc.nextInt();
System.out.println("优惠"+r+"元");
float change=t-total+r;
System.out.println("找零:"+change);
System.out.println("祝您用餐愉快!");
BufferedWriter bw=new BufferedWriter(new FileWriter("KFC.txt",true));
bw.write("总计: "+ total);
bw.newLine();
bw.write("付款:"+t);
bw.newLine();
bw.write("优惠:"+r);
bw.newLine();
bw.write("找零:"+change);
bw.newLine();
bw.flush();
bw.close();
}
}
参考: https://blog.csdn.net/chengqiuming/article/details/70139260