JAVA实现KFC的基本点餐系统(含设计模式)

题目:
同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能:
1.正常餐品结算和找零。
2.基本套餐结算和找零。
3.使用优惠券购买餐品结算和找零。
4.可在一定时间段参与店内活动(自行设计或参考官网信息)。
5.模拟打印小票的功能(写到文件中)。
题目分析:
参考:zoey0130Java博客:实现模拟KFC点餐系统(设计模式)
抽象工厂:生成各种抽象事物的方法,如汉堡,甜点,饮料
具体工厂:生成各种具体食物,如香辣鸡腿堡,牛肉堡,冰淇淋,可乐
接口食物类由汉堡类,炸鸡类,套餐类实现,香辣鸡腿堡类继承汉堡类,并加入价格,名称等属性。在顾客类中实现对象的生成
点餐类实现对餐品的选择,以及活动,优惠券的使用。

UML图
在这里插入图片描述
代码:
接口:

package 肯德基;

public interface Food {          //接口
public void show();
}

实现接口food的类:Hamburger Chicken Drink Dessert Meal

package 肯德基;

public class Hamburger implements Food{
	public void show() {
	}
	public String type;  //每个大种类下的具体种类   
	public int num;      //数量
	public double price;  //价格		
}


package 肯德基;

public class Chicken implements Food{            //food接口的实现类
	public void show() {
		
	}
	public String type;  //每个大种类下的具体种类   
	public int num;      //数量
	public double price;  //价格	 	
}

package 肯德基;

public class Dessert implements Food{
	public void show() {
		System.out.printf("甜点类");
	}
	public String type;  //每个大种类下的具体种类   
	public int num;      //数量
	public double price;  //价格	 	
}


package 肯德基;

public class Drink implements Food{
	public void show() {
	}
	public String type;  //每个大种类下的具体种类   
	public int num;      //数量
	public double price;  //价格	 	
}

package 肯德基;

public class Meal implements Food{
	public void show() {
		}
	public String type;  //每个大种类下的具体种类   
	public int num;      //数量
	public double price;  //价格	
}

继承Hamburger Chicken Drink Dessert Meal的类Ham1,Chicken1等

package 肯德基;
public class Ham1 extends Hamburger{
	public void show() {
		System.out.println("香辣鸡腿堡       " );
		price=20;							
	}
public Ham1(int num) {	
	}
}


package 肯德基;
public class Ham2 extends Hamburger{
public void Ham2(int num) {
	}
public void show() {
	price=25;
	System.out.printf("牛肉堡      ");
}
}
package 肯德基;
public class Chicken1 extends Chicken{          //继承实现类,重写show()函数
	public void Chicken1(int num) {
	}
	public void show() {
		price=15;
		System.out.println("香辣鸡腿      ");
	}
}

package 肯德基;
public class Chicken2 extends Chicken{
	public void Chicken2(int num) {
	}
	public void show() {
		price=15;
		System.out.println("香辣鸡翅  ");
	}
}

package 肯德基;
public class Drink1 extends Drink{
	public void Drink1(int num) {	
	}
	public void show() {
		price=10;
		System.out.println("可乐");
	}
}


package 肯德基;
public class Drink2 extends Drink{
public void Drink2(int num) {
	}
public void show() {
	price=10;
	System.out.println("橙汁      ");
}
}


package 肯德基;
public class Ice extends Dessert{
public void Ice(int num) {
	
	}
public void show() {
	price=15;
	System.out.printf("香草冰淇淋     " );
}
}


package 肯德基;
public class Meal1 extends Meal{
	public void creatMeal1(int num) {
		
	}
	public void show() {
		price=35;
		System.out.println("A套餐(香辣鸡腿堡+可乐+薯条) " );
		type="A套餐(香辣鸡腿堡+可乐+薯条)             35RMB";
	}
}


package 肯德基;
public class Meal2 extends Meal {
public void creatMeal2(int num) {		
	}
public void show() {
	price=45;
	System.out.printf("B套餐(牛肉堡+橙汁+冰淇淋+薯条)  " );
}

}

抽象工厂类

package 肯德基;

public interface KFCFactory {               //抽象工厂,生产抽象食物
	public Chicken creatChicken(int kind,int num);
	public Hamburger creatHamburger(int kind,int num);
	public Drink creatDrink(int kind,int num);
	public Dessert creatDessert(int kind,int num);
	public Meal creatMeal(int kind,int num);
}

实例工厂类

package 肯德基;

public class KFC implements KFCFactory{    // 实例工厂,生产实例食物


	@Override
	public Hamburger creatHamburger(int kind, int num) {
		// TODO Auto-generated method stub
		if(kind==1)
		return new Ham1(num);
	else if(2==kind)
		return new Ham2();
	else
		return null;
	}

	@Override
	public Drink creatDrink(int kind, int num) {
		// TODO Auto-generated method stub
		if(1==kind)
			return new Drink1();
		else if (2==kind)
			return new Drink2();
		else
		return null;
	}

	@Override
	public Dessert creatDessert(int kind, int num) {
		// TODO Auto-generated method stub
		if(1==kind)
			return new Ice();
		else
		return null;
	}

	@Override
	public Chicken creatChicken(int kind, int num) {
		// TODO Auto-generated method stub
		if(1==kind)
			return new Chicken1();
		else if (2==kind)
			return new Chicken2();
		else
		return null;
	}
public Meal creatMeal(int kind, int num) {
		// TODO Auto-generated method stub
		if(1==kind)
			return new Meal1();
		else if (2==kind)
			return new Meal2();
		else
		return null;
	}

	
}

顾客类

package 肯德基;

public class Clerk {
		//肯德基抽象工厂
	    private KFC factory_1;	 
	    //构造方法将抽象工厂传入
	    public Clerk(KFC factory_1){
	    this.factory_1 =factory_1;
	    }	 	 
	    /**
	     * 订购食物
	     */   
	    //汉堡
	    public double orderHamburgers(int kind,int num){
	    	//获得不同种类的汉堡
	        Hamburger hamburger = factory_1.creatHamburger(kind, num);
	        //输出订购信息	    
	        hamburger.show();
	        //返回总价
	        return hamburger.price*num;
	    }
	    
	        //炸鸡
	    public double orderChickens(int kind, int num){
	        //获得不同种类鸡
	        Chicken chicken = factory_1.creatChicken(kind, num);
	        //输出订购信息
	        chicken.show();
	        //返回总价
	        return chicken.price*num;
	    }
	 
	        //甜点
	    public double orderDessert(int kind, int num){
	        //获得薯条
	        Dessert Ice = factory_1.creatDessert(kind, num);
	        //输出订购信息
	        Ice.show();
	        //返回总价
	        return Ice.price*num;
	    }
	 
	        //饮品
	    public double orderDrinkings(int kind, int num){
	        //获得不同种类的饮料
	        Drink drink = factory_1.creatDrink(kind, num);
	        //输出订购信息
	        drink.show();
	        //返回总价
	        return drink.price*num;
	    }
	        //饮品
	    public double orderMeaL(int kind, int num){
	        //获得不同种类的饮料
	        Meal meal = factory_1.creatMeal(kind, num);
	        //输出订购信息
	        meal.show();
	        //返回总价
	        return meal.price*num;
	    }
}

点餐类

package 肯德基;

import java.util.Scanner;

public class Order {
	/**
	   * 定义一个肯德基
	   * (KFCFoodFactory接口类型)
	   */
static KFCFactory factory_1 = new KFC();
    /**
     * 创建职员
     */
    static Clerk customer = new Clerk((KFC) factory_1);
    static int order;  //用户选的的菜系
    static int kind;  //用户选择的食物
    static int num;  //数量
    
	public static void main(String[] args) {	
		 //菜单显示,点餐
		//OrderFoods.showMenu();
		Save t1=new Save();
		t1.write();	
		Menu menu = new Menu();
    	menu.menu1();    	
        int flag = 1;
        int dis = 0;
        int m = 0;
        int pay;
        int lq;
        double total = 0;   //点餐结束的总价
        double total1 = 0;
        double total2 = 0;
        double total3 = 0;
        double total4 = 0;
        double total5 = 0; 
        Scanner sc = new Scanner(System.in);  
        System.out.println("今日活动:凡在今日单次消费超过88元,可享八折优惠"); 
        while(flag != 0) {
        	//Scanner sc = new Scanner(System.in);  
        	
        	System.out.println("请输入餐类:"); 
            order = sc.nextInt();
            System.out.println("请输入餐品:");
            kind = sc.nextInt(); 
            System.out.println("请输入餐品个数:");
            num = sc.nextInt();
           // PrintStream out = System.out;
            //System.setOut(new PrintStream("order.txt"));
	        switch (order) {
			case 1:
				total1 = customer.orderHamburgers(kind, num); 
				break;
			case 2:
				total2 = customer.orderDessert(kind, num);
				break;
			case 3:
				total3 = customer.orderChickens(kind, num);
				break;
			case 4:
				total4 = customer.orderDrinkings(kind, num);
				break;
			case 5:
				total5 = customer.orderMeaL(kind, num);
				break;
			default:
				System.out.println("对不起,您所选择的餐品错误");
	        }
	        //System.setOut(out);
	      System.out.println("是否有优惠券  1——yes 0——no:");
        dis=sc.nextInt();
        if(dis==1)
        {      System.out.println("优惠券类型:1——十元代金券    2——满40,送香草圣代一个");  
        	   m=sc.nextInt();
        }
                 System.out.println("当前消费为" + (total1 +total2 + total3 + total4 +total5));     
	          System.out.println("继续点餐? 1——yes 0——no:");
	        flag = sc.nextInt();	        
	    }
        
        total = total1 +total2 + total3 + total4 +total5;
        if(m==1)
        {   System.out.println("已使用十元代金券");
        	total=total-10;  
        	System.out.println("原价为"+(total+10)+"使用优惠券后价格为"+total);
        }
        if(m==2)
        {
        	if(total>40)
        	{      System.out.println("您的消费已满40元,赠送本店香草圣代一个");}
        }
        if (total > 88) { 
        	System.out.println("消费已满88元,立享八折优惠");
        	System.out.println("total(discount):  "+ 0.8*total);
            System.out.println("祝您用餐愉快");
        }
        else {
            System.out.println("total:  " +total+"元");
            System.out.println("祝您用餐愉快");
 
            
            
        }
          System.out.println("请输入付款金额");
        pay=sc.nextInt();
        lq=(int) (pay-total);        
         System.out.println("收款"+pay+"RBM     找零"+lq+"RMB");
    }
}

界面类

package 肯德基;

public class Menu {
	public  void menu1() {
		System.out.println("               欢迎光临肯德基餐厅                        ");
		System.out.println("----------------------------------------------");
		System.out.println("                    1.汉堡类                                  ");
		System.out.println("1.香辣鸡腿堡    20RMB           2.牛肉堡    25RMB   ");	
		System.out.println("----------------------------------------------");		
		System.out.println("                    2.甜点类                                   ");
		System.out.println("1.冰淇淋          15RMB                             ");
		System.out.println("-----------------------------------------------");
		System.out.println("                    3.炸鸡类                                     ");
		System.out.println("1.香辣鸡腿      15RMB         2.香辣鸡翅       15RMB   ");
		System.out.println("-----------------------------------------------");
		System.out.println("                    4.饮料类                                      ");
		System.out.println("1.可乐           10RMB                2.橙汁    10RMB   ");
		System.out.println("------------------------------------------------");
		System.out.println("                    5.套餐类                                       ");
		System.out.println("1.A套餐(香辣鸡腿堡+可乐+薯条)                   35RMB   ");
		System.out.println("2.B套餐(牛肉堡+橙汁+冰淇淋+薯条               ) 45RMB  ");
		System.out.println("-------------------------------------------------");		
	}
}

餐品信息类

package 肯德基;

public abstract class FoodInfor {
	public String type;  //每个大种类下的具体种类   
	public int num;      //数量
	public double price;  //价格	
}

保存信息类(本程序中没用到)

package 肯德基;
import java.io.File;  
import java.io.InputStreamReader;  
import java.io.BufferedReader;  
import java.io.BufferedWriter;  
import java.io.FileInputStream;  
import java.io.FileWriter;
import java.io.IOException;



public class Save {

		public void write() {
		Meal1 m1=new Meal1();	
		try {
        File writeName = new File("KFC.txt"); // 相对路径,如果没有则要建立一个新的output.txt文件
        writeName.createNewFile(); // 创建新文件,有同名的文件的话直接覆盖
        try (FileWriter writer = new FileWriter(writeName);
             BufferedWriter out = new BufferedWriter(writer)
        ) {
        
           // out.write(m1.type); // \r\n即为换行
            out.write("欢迎光临肯德基餐厅\r\n"); // \r\n即为换行
            out.flush(); // 把缓存区内容压入文件
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

存在的问题
对于同一类餐品无法进行第二次点餐。消费金额没有叠加
在这里插入图片描述
在这里插入图片描述
原因:当选择继续点餐时,flag=1,循环继续,如果选择了同一餐类,total1-5会被新产生的价格覆盖,无法实现价格的叠加。
在这里插入图片描述
程序中还存在着许多问题,还请多多指教。

  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值