KFC收费系统

本文介绍了一个基于Java的KFC收银系统设计,利用工厂方法和抽象工厂模式实现了餐品结算、找零及打印小票等功能。系统涵盖汉堡、薯条、饮料、甜点和套餐的订购流程。

一、作业说明
同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能:
1.正常餐品结算和找零。
2.基本套餐结算和找零。
3.使用优惠劵购买餐品结算和找零。
4.可在一定时间段参与店内活动(自行设计或参考官网信息)。
5.模拟打印小票的功能(写到文件中)。
基本要求:
1.程序设计风格良好,控制台界面友好,最多两人一组完成任务。
2.实现功能测试代码,确保程序的健壮性。
3.画出类图(UML)。
二.代码实现
1.Client.java

package kfc;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class Client {
	 private String s[] =new String[6];
	 private KFCfactory factory_1;
	    //构造方法将抽象工厂传入
	    public Client(KFCfactory factory_1){
	        this.factory_1 = factory_1;
	        }
	    public void showbill() throws IOException{
	   	 BufferedWriter r=new BufferedWriter(new FileWriter("show.txt",true));
	   	 r.write("---------------------账单如下---------------------");
	   	 r.newLine();
	   	 for(int i=0;i<5;i++){
	   	 r.write(s[i]);
	   	 r.newLine();
	   	 r.flush();
	   	// r.close();
	   	 }
	   	 }
	    public double orderHamburgers(int num,int kind) throws IOException
	    {    	
	    	//获得不同种类的汉堡        
	    	Hamburger hamburger = factory_1.createHamburger(num, kind);        
	    	//输出订购信息        
	    	System.out.println(hamburger.printMesage());  
	    	 s[0]=hamburger.printMesage();
	    	 System.out.print("\n");
	    	//返回总价        
	    	return hamburger.totalPrice();   
	    	}
	    public double orderFrenchFries(int num,int kind){    	
	    	       
	    	FrenchFries frenchfries = factory_1.createFrenchFries(num, kind);        
	    	//输出订购信息        
	    	System.out.println(frenchfries.printMesage());   
	    	s[1]=frenchfries.printMesage();
	    	System.out.println("\n");
	    	//返回总价        
	    	return frenchfries.totalPrice();   
	    	}
	    public double orderDrink(int num,int kind){    	
 	       
	    	Drink drink = factory_1.createDrink(num, kind);        
	    	//输出订购信息        
	    	System.out.print(drink.printMesage());
	    	s[2]=drink.printMesage();
	    	System.out.println("\n");
	    	//返回总价        
	    	return drink.totalPrice();   
	    	}
	    public double orderDessert(int num,int kind){    	
 	       
	    	Dessert dessert = factory_1.createDessert(num, kind);        
	    	//输出订购信息        
	    	System.out.println(dessert.printMesage());  
	    	s[3]=dessert.printMesage();
	    	System.out.println("\n");
	    	//返回总价        
	    	return dessert.totalPrice();   
	    	}
    public double orderCombo(int num,int kind){    	
	 	       
	    	Combo combo= factory_1.createCombo(num, kind);        
	    	//输出订购信息        
	    	System.out.println(combo.printMesage());  
    	    s[4]=combo.printMesage();
    	    System.out.println("\n");
    	//返回总价        
	    	return combo.totalPrice();   
            }
	    
}

2.Combo.java

package kfc;

public abstract class Combo extends BaseFood implements PrintMenu{
	public String printMesage()
	 {
	 return ("--" + this.kind + "套餐,\t单价:" + this.price + ",\t数量:" + this.num + ",\t合计:" + this.totalPrice());
	 }

}

3.Dessert.java

package kfc;

public abstract class Dessert extends BaseFood implements PrintMenu{
	public String printMesage()
	 {
	 return ("--" + this.kind + "甜点,\t单价:" + this.price + ",\t数量:" + this.num + ",\t合计:" + this.totalPrice());
	 }

}

4.Drink.java

package kfc;

public abstract class Drink extends BaseFood implements PrintMenu{
	public String printMesage()
	 {
	 return ("--" + this.kind + "饮品,\t单价:" + this.price + ",\t数量:" + this.num + ",\t合计:" + this.totalPrice());
	 }

}

5.FrenchFries.java

package kfc;

public abstract class FrenchFries extends BaseFood implements PrintMenu{
	public String printMesage()
	 {
	 return ("--" + this.kind + "薯条,\t单价:" + this.price + ",\t数量:" + this.num + ",\t合计:" + this.totalPrice());
	 }

}

6.Hamburger.java

package kfc;

public abstract class Hamburger extends BaseFood implements PrintMenu{
	public String printMesage()
	 {
	 return ("--" + this.kind + "汉堡,\t单价:" + this.price + ",\t数量:" + this.num + ",\t合计:" + this.totalPrice());
	 }
}

7.KFCFactory.java

package kfc;

public interface KFCfactory {
	 public Hamburger createHamburger(int num,int kind);
	 public FrenchFries createFrenchFries(int num,int kind);
	 public Dessert createDessert(int num,int kind);
	 public Drink createDrink(int num,int kind);
	 public Combo createCombo(int num,int kind);

}

8.Menu.java

package kfc;

public class Menu {
	public void showsingleFoods(){
		System.out.println("Menu");
		System.out.println("------------------汉堡类-----------------");
		System.out.println("1.新奥尔良鸡腿堡-----------------------15元");
		System.out.println("2.劲脆鸡腿堡--------------------------13元");
		System.out.println("------------------薯条类-----------------");
		System.out.println("1.薯条-------------------------------10元");
		System.out.println("------------------饮品类-----------------");
		System.out.println("1.可口可乐----------------------------4元");
		System.out.println("2.柠檬红茶----------------------------6元");
		System.out.println("------------------甜点类-----------------");
		System.out.println("1.冰激凌-------------------------------5元");
		System.out.println("------------------套餐类-----------------");
		System.out.println("1.单人套餐-----------------------------18元");
		System.out.println("2.双人套餐------------------------------35元");
		
	}
}

9.OneCombo.java

package kfc;

public class OneCombo extends Combo{
	public OneCombo(int num){
		this.kind="单人套餐";
		this.price=18f;
		this.num=num;
	}
}

10.OrderFood.java

package kfc;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.*;
public class OrderFood {
	public static void main(String[] args) throws IOException {
		Date date1=new Date();
		 KFCfactory factory_1 = new RealizeKFCfactory();   
		/**     * 创建职员     */    
	    Client customer = new Client(factory_1);
		Scanner in =new Scanner(System.in);
		Menu menu=new Menu();
		menu.showsingleFoods();
		 System.out.print("\n请点餐:\n");
		 System.out.print("请输入汉堡种类:");
		 int a1=in.nextInt();
		 System.out.print("汉堡个数");
		 int b1=in.nextInt();
		 System.out.print("请输入薯条种类:");
		 int a2=in.nextInt();
		 System.out.print("薯条个数");
		 int b2=in.nextInt();
		 System.out.print("请输入饮品种类:");
		 int a4=in.nextInt();
		 System.out.print("饮品数量:");
		 int b4=in.nextInt();
		 System.out.print("请输入甜点种类:");
		 int a5=in.nextInt();
		 System.out.print("甜点个数:");
		 int b5=in.nextInt();
		 System.out.print("请输入套餐种类:");
		 int a6=in.nextInt();
		 System.out.print("套餐个数:");
		 int b6=in.nextInt();
		 System.out.print("\n------账单如下-----\n");
		 System.out.println(date1);
		 double hamhurgMoney =  customer.orderHamburgers(b1,a1);
		 double  frenchfriesMoney = customer.orderFrenchFries(b2,a2);
		double drinkMoney = customer.orderDrink(b4,a4);
		 double dessert= customer.orderDessert(b5,a5);
		 double combomoney=customer.orderCombo(b6,a6);
		double sum=hamhurgMoney + drinkMoney+dessert+frenchfriesMoney+ combomoney;
		 customer.showbill();
		 System.out.println("总计:" + (sum));
		 System.out.print("请输入付款金额:");
		 int a=in.nextInt();
		 if(a<sum)
	     {System.out.println("钱数不够呦");
	     }
		 else 
		 {
		System.out.print("找零:"+(a-sum));}
		 customer.showbill();
		 BufferedWriter r=new BufferedWriter(new FileWriter("show.txt",true));
		 r.write("总计: "+sum);
		 r.newLine();
		 r.write("付款:"+a);
		 r.newLine();
		 double y=a-sum;
		 if(y>=0)
		 {r.write("找零:"+y);}
		 else{r.write("支付失败");}
		 r.newLine();
		 r.flush();
		 r.close();
		 in.close();
		}    	
	}

11.PrintMenu.java

package kfc;

public interface PrintMenu {
	String printMesage();
}

12.RealizeDessert_1.java

package kfc;

public class RealizeDessert_1 extends Dessert{
	public RealizeDessert_1(int num)
	 {
	 this.kind = "冰激凌";
	 this.price = 5.0f;
	 this.num = num;
	 }

}

13.RealizeDrink_1.java

package kfc;

public class RealizeDrink_1 extends Drink{
	public RealizeDrink_1(int num)
	 {
	 this.kind = "可口可乐";
	 this.price = 4.0f;
	 this.num = num;
	 }

}

14.RealizeDrink_2.java

package kfc;

public class RealizeDrink_2 extends Drink{
	public RealizeDrink_2(int num)
	 {
	 this.kind = "柠檬红茶";
	 this.price = 6.0f;
	 this.num = num;
	 }

}

15.RealizeFrenchFries.java

package kfc;

public class RealizeFrenchFries extends FrenchFries{
	public RealizeFrenchFries(int num)
	 {
	 this.kind = "薯条";
	 this.price = 10.0f;
	 this.num = num;
	 }

}

16.RealizeHamburger_1.java

package kfc;

public class RealizeHamburger_1 extends Hamburger{
	public RealizeHamburger_1(int num)
	 {
	 this.kind = "新奥尔良烤鸡腿堡";
	 this.price = 15.0f;
	 this.num = num;
	 }
}

17.RealizeHamburger_2.java

package kfc;

public class RealizeHamburger_2 extends Hamburger{
	public RealizeHamburger_2(int num)
	 {
	 this.kind = "劲脆鸡腿堡";
	 this.price = 13.0f;
	 this.num = num;
	 }
}

18.RealizeKFCfactory.java

package kfc;

public class RealizeKFCfactory implements KFCfactory{
	 public Hamburger createHamburger(int num,int kind){
		 if(1==kind)    		
			 return new RealizeHamburger_1(num);    	//新奥尔良烤鸡腿堡    	
		 else if(2==kind)    		
			 return new RealizeHamburger_2(num);    	//劲脆鸡腿堡    	
		 else    		
			 return null;
	 }
	 public FrenchFries createFrenchFries(int num,int kind){
		 if(1==kind)    		
			 return new RealizeFrenchFries(num);
		 else
		return null;
	 }
	 public Dessert createDessert(int num,int kind){
		 if(1==kind)    		
			 return new RealizeDessert_1(num);
		 else
			 return null;
	 }
	 public Drink createDrink(int num,int kind){
		 if(1==kind)    		
			 return new RealizeDrink_1(num);
		 else if(2==kind)
			 return new RealizeDrink_2(num);
		 else 
			 return null;
	 }
	 public Combo createCombo(int num,int kind){
		 if(1==kind)    		
			 return new OneCombo(num);
		 else if(2==kind)
			 return new TwoCombo(num);
		 else 
			 return null;
	 }
}

19.TwoCombo.java

package kfc;

public class TwoCombo extends Combo{
	public TwoCombo(int num){
		this.kind="双人套餐";
		this.price=35f;
		this.num=num;
	}

}

20.BaseFood.java

package kfc;

public class BaseFood {
	protected String kind;
	 protected int num;
	 protected float price;
	 public float totalPrice()
	 {
	 return this.num * this.price;
	 }
}

三.类图
1
2

四.总结
作业完成基本要求。
工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
抽象工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。
这次学习关于Java Io流的知识,也得到了实际应用,有关io流相关知识链接:
https://www.cnblogs.com/x_wukong/p/4679116.html
作业主要用了工厂方法和抽象工厂模式来实现KFC收费系统,主要思想参考https://www.jb51.net/article/155300.htm;需要改进的功能就是点单,设计的有点麻烦,还需要完善。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值