一.同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能:1.正常餐品结算和找零。2.基本套餐结算和找零。3.使用优惠劵购买餐品结算和找零。4.可在一定时间段参与店内活动(自行设计或参考官网信息)。5.模拟打印小票的功能(写到文件中)。基本要求:1.程序设计风格良好,控制台界面友好,最多两人一组完成任务。2.实现功能测试代码,确保程序的健壮性。画出使用的设计模式图。
二.设计模式本题采用的单例模式和策略模式:在所有的肯德基店中,收银系统只有一台,将所有的功能都置于收银系统中,即可完成收银系统的功能。在收钱在一部分,不管是普通支付,优惠券支付和折扣支付都是完成支付这一功能,只是采用了不同的形式而已,因此选择策略模式。
三.UML类图
四.代码
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
ArrayList<Integer> list = new ArrayList<>();
CollectMoneySystem ms = CollectMoneySystem.getInstance();
System.out.println("欢迎来到肯德基");
menu();
System.out.println("请输入你想执行的操作:");
int choice = scan.nextInt();
while(true) {
switch(choice) {
case(1):foodMenu();
break;
case(2):System.out.println("请输入你想要的相应食物编号:(请以-1结束输入)");
while(true) {
int num = scan.nextInt();
if(num == -1) {
break;
}
list.add(num);
}
break;
case(3):double sum = totalMoney(list);
System.out.println("您的账单是" + sum + "元");
System.out.println("请选择您所有支付的类型:");
System.out.println("1.普通支付");
System.out.println("2.优惠卷支付");
System.out.println("3.折扣支付");
int answer = scan.nextInt();
ms.getPayWay(answer);
System.out.println("请支付您的账单:");
double cash = scan.nextDouble();
double money = ms.cm.collectMoney(sum, cash);
System.out.println("找您的零钱为:" + money);
break;
case(4):System.out.println("请输入活动类型的数字:");
System.out.println("1.Activity1");
System.out.println("2.Activity2");
answer = scan.nextInt();
ms.getActWay(answer);
ms.oa.showActivityInfo();
case(5):ms.pr.print(list);
}
if(choice == 6) {
System.out.println("感谢使用肯德基自主选餐系统");
break;
}
menu();
System.out.println("请输入你想执行的操作:");
choice = scan.nextInt();
}
}
//功能菜单
public static void menu() {
System.out.println("1.查看菜单");
System.out.println("2.开始选餐");
System.out.println("3.结算账单");
System.out.println("4.查看最近活动信息");
System.out.println("5.打印小票");
System.out.println("6.退出");
}
//食物菜单
public static void foodMenu() {
System.out.println("*****************************************");
System.out.println("主食系列:");
System.out.println("1.香辣鸡腿堡..........12.5元");
System.out.println("2.劲脆鸡腿堡..........12.5元");
System.out.println("3.新奥尔良烤鸡腿堡......13.5元");
System.out.println("4.鸡米花.............7.5元");
System.out.println("5.黑椒鸡块............7元");
System.out.println("6.上校鸡块(6块).......11元");
System.out.println("饮品系列:");
System.out.println("7.牛奶...............5元");
System.out.println("8.百事可乐/美年达.......6元");
System.out.println("9.珍珠奶茶............7元");
System.out.println("套餐系列:");
System.out.println("10.套餐A:劲脆鸡腿堡+中杯可乐.....13.5元");
System.out.println("11.套餐B:上校鸡块(四块)+土豆泥+美年达...15元");
System.out.println("12.套餐C:香辣鸡腿堡+黑椒鸡块+小杯可乐....18元");
System.out.println("*****************************************");
}
//计算顾客所选食物的总价钱
public static double totalMoney(ArrayList<Integer> list) {
double sum = 0.0;
for(int i = 0 ;i<list.size();i++) {
int food = list.get(i);
switch(food) {
case(1):sum += 12.5;
break;
case(2):sum += 12.5;
break;
case(3):sum += 13.5;
break;
case(4):sum += 7.5;
break;
case(5):sum += 7;
break;
case(6):sum += 11;
break;
case(7):sum += 5;
break;
case(8):sum += 6;
break;
case(9):sum += 7;
break;
case(10):sum += 13.5;
break;
case(11):sum += 15;
break;
case(12):sum += 18;
break;
}
}
return sum;
}