题目:
同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能:
1.正常餐品结算和找零。
2.基本套餐结算和找零。
3.使用优惠劵购买餐品结算和找零。
4.可在一定时间段参与店内活动(自行设计或参考官网信息)。
5.模拟打印小票的功能(写到文件中)。
基本要求:
1.程序设计风格良好,控制台界面友好,最多两人一组完成任务。
2.实现功能测试代码,确保程序的健壮性。
3.画出使用的设计模式图。
提高要求:
1.实现可视化界面(使用MFC)。
2.实现会员储值卡功能,完成储值卡消费。
3.实现当天营业额和餐品销量计算和统计,用数据库记录。
算法设计:
- 分析程序可先将程序分为三大类,一个是顾客类,一个是肯德基店类,一个是食物类。
- 再次抽象分析,可将肯德基店看为一个工厂,食物产品看为工厂产生的对象,顾客与产品和肯德基点产生联系。
- 创建一个抽象类AbstractFood和一个工厂接口Kfcfactory。
- 创建具体工厂MykfcFactory和各类食物接口以及各类详细食品类。
- 创建顾客类Customer,来得到顾客点餐信息。
- 创建菜单类MyMenu,来实现顾客点餐以及是否领取优惠卷。
- 创建File类,来实现打印输出。
设计模式图:
测试案例:
实现效果:
文本记录:
源代码实现:
//抽象食品类
public abstract class AbstractFood {
protected String kind;//类别
protected int num; //购买数量
protected double price;//价格
abstract void display();//展示基本信息
public double totalPrice() {
return num*price;
}
}
//工厂接口类
public interface KfcFactory {
public Hamburg createHamburg(int num);//生产汉堡
public FrenchFries createFrenchFries(int num);//生产薯条
public ChickenWings createChickenWings(int num);//生产鸡翅
public Drink createDrink(int num);//生产饮料
public TodayDiscount createTodayDiscount(int num);//今日折扣
}
//具体工厂类
public class MykfcFactory implements KfcFactory{
@Override
public Hamburg createHamburg(int num) {
// TODO Auto-generated method stub
return new MyHamburg(num);
}
@Override
public FrenchFries createFrenchFries(int num) {
// TODO Auto-generated method stub
return new MyFrenchFries(num);
}
@Override
public ChickenWings createChickenWings(int num) {
// TODO Auto-generated method stub
return new MyChickenWings(num);
}
@Override
public Drink createDrink(int num) {
// TODO Auto-generated method stub
return new MyDrink(num);
}
@Override
public TodayDiscount createTodayDiscount(int num) {
// TODO Auto-generated method stub
return new MyTodayDiscount(num);
}
}
//具体食品抽象类,因为其余类似,所以只举例这一种
public abstract class Hamburg extends AbstractFood {
public void display() {
System.out.println("--"+this.kind+"汉堡,\t单价:"+this.price
+",\t数量"+this.num+"\t合计:"+this.totalPrice());
}
}
//食品具体类
public class MyHamburg extends Hamburg {
public MyHamburg(int num) {
this.kind="经典";
this.price=15;
this.num=num;
}
}
//顾客类
public class Customer {
private KfcFactory kf;
public Customer(KfcFactory kf) {
this.kf=kf;
}
//订购食物
public double orderHamburg(int num) {
kf.createHamburg(num).display();//输出具体信息
return kf.createHamburg(num).totalPrice();
}
public double orderChickenWings(int num) {
kf.createChickenWings(num).display();
return kf.createChickenWings(num).totalPrice();
}
public double orderFrenchFries(int num) {
kf.createFrenchFries(num).display();
return kf.createFrenchFries(num).totalPrice();
}
public double orderDrink(int num) {
kf.createDrink(num).display();
return kf.createDrink(num).totalPrice();
}
public double orderTodayDiscount(int num) {
kf.createTodayDiscount(num).display();
return kf.createTodayDiscount(num).totalPrice();
}
}
菜单类
public class MyMenu {
KfcFactory kf=new MykfcFactory();//创建工厂
Customer customer=new Customer(kf);//创建客户
int hn;//汉堡数量
int cn;//鸡翅数量
int fn;//薯条数量
int dn;//饮料数量
int tn;//特惠数量
int choice;//选择
double hamburgMoney,chickenWingMoney,
frenchFriesMoney,drinkMoney;//各物品价钱
int discount=0;//优惠劵
double money;//付款
double price;//价格
double charge;//找零
Scanner in=new Scanner(System.in);
public void menu() {
System.out.println("* * * * * 欢迎光临肯德基 * * * * *");
System.out.println("* 您可以选择:1.单点 2.套餐 *");
System.out.print("* 请您选择:");
switch(choice=in.nextInt()) {
case 1:
System.out.println("- - - - - - - - - - - - - - - - - - - - - - - - ");
System.out.println("1.汉堡类:经典口味:15元");
System.out.println("- - - - - - - - - - - - - - - - - - - - - - - - ");
System.out.println("2.鸡翅类:烧烤口味:6元");
System.out.println("- - - - - - - - - - - - - - - - - - - - - - - - ");
System.out.println("3.薯条类:番茄口味:6元");
System.out.println("- - - - - - - - - - - - - - - - - - - - - - - - ");
System.out.println("4.饮料类:雪碧:3元");
System.out.println("- - - - - - - - - - - - - - - - - - - - - - - - ");
System.out.print("请您选择汉堡数量:");
hamburgMoney=customer.orderHamburg(hn=in.nextInt());
System.out.print("请您选择鸡翅数量:");
chickenWingMoney=customer.orderChickenWings(cn=in.nextInt());
System.out.print("请您选择薯条数量:");
frenchFriesMoney=customer.orderFrenchFries(fn=in.nextInt());
System.out.print("请您选择饮料数量:");
drinkMoney=customer.orderDrink(dn=in.nextInt());
price=hamburgMoney+chickenWingMoney+frenchFriesMoney+drinkMoney;
System.out.println("总计:"+price);
break;
case 2:
System.out.println("- - - - - - - - - - - - - - - - - - - - - - - - ");
System.out.println("今日特惠:烤堡+2个鸡翅+薯条+雪碧_36元");
System.out.println("- - - - - - - - - - - - - - - - - - - - - - - - ");
System.out.print("请选择特惠数量:");
price=customer.orderTodayDiscount(tn=in.nextInt());
System.out.println("总计"+price);
break;
default:
System.out.println("输入错误!");
}
}
public void discount() {
System.out.println("今日优惠卷:");
System.out.println("---1、满30减5----2、满50减10---");
System.out.println("是否领取?(y/n)");
if("y".equals(in.next())) {
if(price>30&&price<50) {
System.out.println("您已领取5元优惠劵");
price-=5;
discount=5;
}else if(price>=50) {
price-=10;
discount=10;
System.out.println("您已领取10元优惠卷");
}else {
System.out.println("您的消费金额不能领取优惠卷");
}
}
else {
System.out.println("感谢你的光顾!");
System.out.println("您已领取"+discount+"元优惠劵!\n您一共消费;"+price);
}
System.out.println("顾客付款:");
money=in.nextInt();
charge=money-price;
System.out.println("实付款:"+price);
System.out.println("找零:"+charge);
}
}
//打印类:
public class File {
private MyMenu mm;
public File(MyMenu mm) {
this.mm=mm;
}
public void print() {
Scanner in=new Scanner(System.in);
System.out.print("是否需要打印详细账单(y/n):");
if("y".equals(in.next())) {
System.out.println("您的帐单为:");
switch(mm.choice){
case 1:
mm.hamburgMoney=mm.customer.orderHamburg(mm.hn);
mm.chickenWingMoney = mm.customer.orderChickenWings(mm.cn);
mm.frenchFriesMoney = mm.customer.orderFrenchFries(mm.fn);
mm.drinkMoney = mm.customer.orderDrink(mm.dn);
System.out.println("领取"+mm.discount+"元优惠券");
System.out.println("总计:"+mm.price);
System.out.println("顾客付款:"+mm.money);
System.out.println("实付:"+mm.price);
System.out.println("找零:"+mm.charge);
break;
case 2:
mm.price =mm.customer.orderTodayDiscount(mm.tn);
System.out.println("领取"+mm.discount+"元优惠券");
System.out.println("总计:"+mm.price);
System.out.println("顾客付款:"+mm.money);
System.out.println("实付:"+mm.price);
System.out.println("找零:"+mm.charge);
break;
}
try {
file();
}catch(Exception e) {
e.printStackTrace();
}
}
else {
System.out.println("欢迎下次光临");
in.close();
}
}
private void file() throws Exception{
FileWriter fw=new FileWriter("zhangdan.txt",true);
BufferedWriter bw = new BufferedWriter(fw);
try {
switch(mm.choice) {
case 1:
bw.write("* * * * * * * * *详细账单* * * * * * * *\r\n");
bw.write("汉堡 "+"单价:15 数量:"+mm.hn+"合计:"+mm.hamburgMoney+"\r\n");
bw.write("鸡翅 "+"单价:6 数量:"+mm.cn+"合计:"+mm.chickenWingMoney+"\r\n");
bw.write("薯条 "+"单价:6 数量:"+mm.fn+"合计:"+mm.frenchFriesMoney+"\r\n");
bw.write("雪碧 "+"单价:3 数量:"+mm.dn+"合计:"+mm.drinkMoney+"\r\n");
bw.write("使用优惠卷:"+mm.discount+"\r\n");
bw.write("总计:"+mm.price+"\r\n");
bw.write("顾客付款:"+mm.money+"\r\n");
bw.write("找零:"+mm.charge+"\r\n");
bw.flush();
bw.close();
break;
case 2:
bw.write("* * * * * * * *详细账单* * * * * * * *\r\n");
bw.write("超值套餐1 "+"单价:36 数量:"+mm.tn+"合计:"+mm.price+"\r\n");
bw.write("使用优惠卷:"+mm.discount+"\r\n");
bw.write("总计:"+mm.price+"\r\n");
bw.write("顾客付款:"+mm.money+"\r\n");
bw.write("找零:"+mm.charge+"\r\n");
bw.flush();
bw.close();
break;
}
}catch(IOException e) {
e.printStackTrace();
}
System.out.println("打印成功,欢迎下次光临!");
}
}
//主函数
public class Main {
public static void main(String[] args) {
Date date=new Date();
DateFormat fullFormat=DateFormat.getDateInstance(DateFormat.FULL);
System.out.println("当前日期:"+fullFormat.format(date));
MyMenu mm=new MyMenu();
File f=new File(mm);
mm.menu();
mm.discount();
f.print();
}
}
总结:在所学的设计模式中最后使用了工厂模式与抽象工厂模式,因为工厂模式比较适用于生产不同类的产品,就如肯德基店和生产各类食品的关系,而抽象工厂更适合用于套餐结合的形式,因为我只举了一个套餐,可能体会的不太明显。
参考链接:https://blog.csdn.net/weixin_44697475/article/details/90084082?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-3