Java 实现简单的KFC点餐结算

一. 题目分析及要求

同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能:
1.正常餐品结算和找零。
2.基本套餐结算和找零。
3.使用优惠劵购买餐品结算和找零。
4.模拟打印小票的功能(写到文件中)。
基本要求:
1.实现功能测试代码,确保程序的健壮性。
2.画出使用的设计模式图。

二. 设计模式

单点食物
采用简单工厂模式,利用Java反射机制来实现食品类的实例化。
工厂类名 : ( SimFoodFactory )

套餐产品
采用抽象工厂模式,实现套餐系列产品的生成(三个)
工厂类名:(ComboOneFactory, ComboSecondFactory ,ComboThirdFactory )

三. 类图设计

在这里插入图片描述

四. 算法实现

1.实体类 Food

public class Food {
    public Integer id;
    public String name;
    public Double price;

    public Integer getId(){
        return id;

    }
    public String getName(){
        return name;
    }

    public Double getPrice(){
        return price;
    }

}

2.Drink 类,Eat 类 继承 Food基类

public class Eat extends Food {
    public Float quality;

    public Float getQuality(){
        return quality;
    }
        @Override
                public String toString(){
            return "Eat{"+
                    "quality=" +quality+
                    ", id="+ id +
                    ", name='"+name +'\''+
                    ", price="+price+
        '}'  ;


}}
3.单种食物,单种饮料分别继承Eat 及 Drink
如:①食物单品
public class ChipsItem extends Eat {
    public ChipsItem() {
        this.id=1006;
        this.name="波纹霸王薯条";
        this.price=12.0;
        this.quality=50f;

    }
}

 ②饮料单品
public class BeerItem extends Drink {
    public BeerItem(){
        this.id = 1004;
        this.name = "百威啤酒";
        this.price= 15.0;
        this.capacity= 120f;
    }
}

4.简单工厂,通过反射机制加载食物类实例(单点)

import kfc.order.item.Food;

/**
 *
 * 简单工厂,反射加载食物类实例(单点食物)
 */

public class SimFoodFactory {
    public Food getFood(Class c){
        try{
            return (Food) Class.forName(c.getName()).newInstance();
        }catch (InstantiationException | IllegalAccessException| ClassNotFoundException e){
            e.printStackTrace();
        }
        return null;
    }


}

5.套餐组合通过CombFactory 接口的实现来加载

mport kfc.order.item.Food;

import java.util.List;

/**
 * 抽象工厂,加载KFC组合套餐
 */
public interface CombFactory {
    List<Food> getCombo();
}



具体一号套餐
import kfc.order.item.BeerItem;
import kfc.order.item.ChickenItem;
import kfc.order.item.Food;

import java.util.ArrayList;
import java.util.List;

/**
 * 啤酒炸鸡 (1)号套餐
 */
public class ComboOneFactory implements CombFactory{
@Override
public List<Food> getCombo(){
        List<Food> foodOneList= new ArrayList<Food>();//存储套餐产品
        Food chick=new ChickenItem();//实例化套餐内的产品
        Food beer =new BeerItem();
        chick.price=chick.price-2;//套餐的优惠,炸鸡价格减2元
        beer.price=beer.price-1;//套餐的优惠,啤酒价格减1元
        foodOneList.add(chick);
        foodOneList.add(beer);
        return foodOneList;//返回套餐集合

        }
}

6.FoodControler 类 通过函数处理具体点餐事务

import kfc.order.item.*;
import kfc.order.service.ComboOneFactory;
import kfc.order.service.ComboSecondFactory;
import kfc.order.service.ComboThirdFactory;
import kfc.order.service.SimFoodFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;


public class FoodControler {
     static SimFoodFactory simFoodFactory = new SimFoodFactory();//简单工厂实例化
     static List<Food> foodList = new ArrayList<>();

    public  void service(){
        Scanner sc = new Scanner(System.in);

        String choose = sc.nextLine();
        switch (choose){
            case "7":
                foodList = new ComboOneFactory().getCombo();//抽象工厂产生套餐1
                break;
            case "8":
                foodList = new ComboSecondFactory().getCombo();//抽象工厂产生套餐2
                break;
            case "9":
                foodList = new ComboThirdFactory().getCombo();//抽象工厂产生套餐3
                break;
            case"1":
            //香辣炸鸡
               Food food_1= simFoodFactory.getFood(ChickenItem.class);//反射加载单品食物
                foodList.add(food_1);
                break;
            case"2":
                //香辣鸡腿堡
               Food food_2 = simFoodFactory.getFood(HamburgerItem.class);
                foodList.add(food_2);
                break;
            case"3":
                //薯条
               Food food_3 = simFoodFactory.getFood(ChipsItem.class);
                foodList.add(food_3);
                break;
            case"4":
                //美式
                Food food_4 = simFoodFactory.getFood(CafeItem.class);
                foodList.add(food_4);
                break;
            case"5":
                //可乐
               Food food_5 = simFoodFactory.getFood(CokeItem.class);
                foodList.add(food_5);
                break;
            case"6":
                //百威啤酒
               Food  food_6 = simFoodFactory.getFood(BeerItem.class);
                foodList.add(food_6);
                break;


          default:
              System.out.println("您所输入的点餐序号不存在");
              foodList = new ArrayList();
        }

}}

7.MainApp 类处理结算及顾客选择

其功能实现为其他类实例化对象当做方法参数使用

五. 测试截图

点餐界面截图

在这里插入图片描述

小票截图

在这里插入图片描述

六. 个人总结

Java Swing 可视化还未能掌握,因此此次程序设计只完成了基本要求。在程序编写中,对Java面向对象的思想有了更深的理解,也提升了编程中解决问题的能力。
在食物的实例化过程中,对建造者设计模式有了进一步的认识。同时对Java的反射机制有了一定的理解。

附 : 源码

package kfc.order.item;

public class Food {
    public Integer id;
    public String name;
    public Double price;

    public Integer getId(){
        return id;

    }
    public String getName(){
        return name;
    }

    public Double getPrice(){
        return price;
    }

}

package kfc.order.item;

public class Eat extends Food {
    public Float quality;

    public Float getQuality(){
        return quality;
    }
        @Override
                public String toString(){
            return "Eat{"+
                    "quality=" +quality+
                    ", id="+ id +
                    ", name='"+name +'\''+
                    ", price="+price+
        '}'  ;


    }
}

package kfc.order.item;

public class Drink  extends Food{
    public Float capacity;

    public Float getCapacity(){
        return capacity;

    }
    @Override
    public String toString(){
        return "Drink{"+
                "capacity=" +capacity+
                ", id="+ id +
                ", name='"+name +'\''+
                ", price="+price+
                '}';

    }
}

package kfc.order.item;

public class HamburgerItem  extends Eat {
    public HamburgerItem(){
        this.id = 1001;
        this.name = "香辣大虾堡";
        this.price = 22.0;
        this.quality = 10f;
    }
}

package kfc.order.item;

public class CokeItem extends Drink {
    public CokeItem(){
        this.id = 1003;
        this.name ="可口可乐";
        this.price = 11.0;
        this.capacity = 200f;

    }

}

package kfc.order.item;

public class ChipsItem extends Eat {
    public ChipsItem() {
        this.id=1006;
        this.name="波纹霸王薯条";
        this.price=12.0;
        this.quality=50f;

    }
}

package kfc.order.item;

public class ChickenItem extends Eat{
    public ChickenItem(){
        this.id = 1002;
        this.name = "香辣鸡翅";
        this.price = 48.0;
        this.quality = 100f;

    }

}

package kfc.order.item;

public class CafeItem extends Drink {
     public CafeItem(){
         this.id = 1005;
         this.name ="美式咖啡";
         this.price = 17.0;
         this.capacity =100f;
     }
}

package kfc.order.item;

public class BeerItem extends Drink {
    public BeerItem(){
        this.id = 1004;
        this.name = "百威啤酒";
        this.price= 15.0;
        this.capacity= 120f;
    }
}

package kfc.order.service;

import kfc.order.item.Food;

import java.util.List;

/**
 * 抽象工厂,加载KFC组合套餐
 */
public interface CombFactory {
    List<Food> getCombo();
}

package kfc.order.service;

import kfc.order.item.BeerItem;
import kfc.order.item.ChickenItem;
import kfc.order.item.Food;

import java.util.ArrayList;
import java.util.List;

/**
 * 啤酒炸鸡 (1)号套餐
 */
public class ComboOneFactory implements CombFactory{
@Override
public List<Food> getCombo(){
        List<Food> foodOneList= new ArrayList<Food>();//存储套餐产品
        Food chick=new ChickenItem();//实例化套餐内的产品
        Food beer =new BeerItem();
        chick.price=chick.price-2;//套餐的优惠,炸鸡价格减2元
        beer.price=beer.price-1;//套餐的优惠,啤酒价格减1元
        foodOneList.add(chick);
        foodOneList.add(beer);
        return foodOneList;//返回套餐集合

        }
}

package kfc.order.service;

import kfc.order.item.CafeItem;
import kfc.order.item.Food;
import kfc.order.item.HamburgerItem;

import java.util.ArrayList;
import java.util.List;

/**
 * 咖啡和汉堡 (2)号套餐
 */

public class ComboSecondFactory implements CombFactory {
    public List<Food> getCombo(){
        List<Food> foodSecondList= new ArrayList<Food>();
        Food ham = new HamburgerItem();
        Food  cafe= new CafeItem();
        ham.price = ham.price-1;//套餐组合的优惠 汉堡减一元
        cafe.price = cafe.price-0.5;//套餐组合的优惠 咖啡减0.5元
        foodSecondList.add(cafe);
        foodSecondList.add(ham);
        return foodSecondList;

    }
}

package kfc.order.service;

import kfc.order.item.ChipsItem;
import kfc.order.item.CokeItem;
import kfc.order.item.Food;

import java.util.ArrayList;
import java.util.List;

/**
 * 可乐和薯条 (3)号套餐
 */
public class ComboThirdFactory implements CombFactory {
    @Override
    public List<Food> getCombo() {
        List<Food> foodThreeList = new ArrayList<Food>();
        Food chips = new ChipsItem();
        Food cola = new CokeItem();
        cola.price = cola.price - 1;//套餐组合的优惠
        chips.price = chips.price - 0.5;
        foodThreeList.add(chips);
        foodThreeList.add(cola);
        return foodThreeList;
    }
}

package kfc.order.service;

import kfc.order.item.Food;

/**
 *
 * 简单工厂,反射加载食物类实例(单点食物)
 */

public class SimFoodFactory {
    public Food getFood(Class c){
        try{
            return (Food) Class.forName(c.getName()).newInstance();
        }catch (InstantiationException | IllegalAccessException| ClassNotFoundException e){
            e.printStackTrace();
        }
        return null;
    }


}

package kfc.order.control;

import kfc.order.item.*;
import kfc.order.service.ComboOneFactory;
import kfc.order.service.ComboSecondFactory;
import kfc.order.service.ComboThirdFactory;
import kfc.order.service.SimFoodFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;


public class FoodControler {
     static SimFoodFactory simFoodFactory = new SimFoodFactory();//简单工厂实例化
     static List<Food> foodList = new ArrayList<>();

    public  void service(){
        Scanner sc = new Scanner(System.in);

        String choose = sc.nextLine();
        switch (choose){
            case "7":
                foodList = new ComboOneFactory().getCombo();//抽象工厂产生套餐1
                break;
            case "8":
                foodList = new ComboSecondFactory().getCombo();//抽象工厂产生套餐2
                break;
            case "9":
                foodList = new ComboThirdFactory().getCombo();//抽象工厂产生套餐3
                break;
            case"1":
            //香辣炸鸡
               Food food_1= simFoodFactory.getFood(ChickenItem.class);
                foodList.add(food_1);
                break;
            case"2":
                //香辣鸡腿堡
               Food food_2 = simFoodFactory.getFood(HamburgerItem.class);
                foodList.add(food_2);
                break;
            case"3":
                //薯条
               Food food_3 = simFoodFactory.getFood(ChipsItem.class);
                foodList.add(food_3);
                break;
            case"4":
                //美式
                Food food_4 = simFoodFactory.getFood(CafeItem.class);
                foodList.add(food_4);
                break;
            case"5":
                //可乐
               Food food_5 = simFoodFactory.getFood(CokeItem.class);
                foodList.add(food_5);
                break;
            case"6":
                //百威啤酒
               Food  food_6 = simFoodFactory.getFood(BeerItem.class);
                foodList.add(food_6);
                break;


          default:
              System.out.println("您所输入的点餐序号不存在");
              foodList = new ArrayList();
        }



}}

package kfc.order.control;

import kfc.order.item.Food;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import java.util.List;


public class  MoneyAnalyze {
    public   Double getMoneyCount(List<Food> list ){//,Double disCount,Double tickets){
        Double moneyCount = 0.0; //顾客应付钱数
        for (Food food:list){
            moneyCount += food.price;

        }//return moneyCount*disCount-tickets;  //计算折扣后应付钱数
        return moneyCount;
    }

    /**
     * 找零
     * @param inMoney 收入的钱数
     * @param  count 应收钱数
     */
    public  Double getChange( Double inMoney,Double count){
        return inMoney-count;
    }
    /**
     * 打印小票
     *
     */
    public  void receipt(List<Food>list ,Double disCount,Double tickets) throws IOException{

          Date currentTime = new Date();

          FileWriter fileWriter= new FileWriter("receipt.txt");
          BufferedWriter bw = new BufferedWriter(fileWriter);
          bw.write("————————————————————欢迎光临  **有点LOW**  KFC————————————————"+"\r\n");
          bw.write("\n\n");
          bw.write("订单时间:"+currentTime+"\r\n\n");
          bw.write("您本次消费清单如下"+"\r\n");
          for (Food food:list){
              bw.write("ID:"+food.id+"\r\n");
              bw.write("食物:"+food.name+"\r\n");
              bw.write("金额:"+food.price+"\r\n");
          }
          bw.write("折扣"+disCount*10 +"折"+"\r\n");
          bw.write("优惠"+tickets+"元"+"\r\n");
          bw.write("总金额"+((getMoneyCount(list)*disCount)-tickets)+ "\u5143");
          bw.flush();
          bw.close();

    }


}

package kfc.order.control;

import java.io.IOException;
import java.util.Scanner;

public class MainApp {
    public static  Double tickets=0.0 ;
    public static Double disCount=1.0;
    MoneyAnalyze moneyAnalyze = new MoneyAnalyze();
    static FoodControler foodControler = new FoodControler();


    public void interFace()throws IOException{
        System.out.println("============================================================");
        System.out.println("************************************************************\n");
        System.out.println("--------------------欢迎光临KFC------------------------------");
        System.out.println("**************     1.点餐                                    \n");
        System.out.println("**************     2.领取优惠卷 (请在购买商品之后查看领取哦)   \n");
        System.out.println("**************     3.结算                                    \n");
        System.out.println("*************************************************************\n");
        System.out.println("=============================================================");
        System.out.println("请选择服务类型:");
        chooseServe();
    }
    public void chooseServe() throws IOException {
        Scanner sc = new Scanner(System.in);
        String inter =sc.nextLine();
        while (true){
        if(inter.equals("1")){
            orderMeal();

            break;
        }
        else if(inter.equals("2")){
            System.out.println("满50减3.6元");
            System.out.println("满80减5.0元");
            System.out.println("请选择服务类型:");
            chooseServe();
            break;
        }
        else if(inter.equals("3")){
            if(foodControler.foodList!=null){
            settlement();
            break;}
            else {
                System.out.println("您当前还未点餐,结算系统锁定,请点餐后选择");
                chooseServe();
            }
        }else {
            System.out.println("服务类型不存在,我们正在完善中,请您重新选择 ");
            chooseServe();
            break;
        }}
    }
    public void orderMeal() throws IOException {
        System.out.println("\n");
        System.out.println("----------------  本店推出以下菜品:--------------------------");
        System.out.println("①  自选单品");
        System.out.println("1. 香辣鸡翅:48元/份             2. 香辣大虾堡:22元/个");
        System.out.println("3. 波纹霸王薯条: 12元/份        4. 美式咖啡:17元/杯  ");
        System.out.println("5. 可口可乐:11元/杯             6. 百威啤酒:15元/杯    " );
        System.out.println("②  人气套餐——有优惠哦");
        System.out.println("7. 套餐一:啤酒+炸鸡:60元/份");
        System.out.println("8. 套餐二:汉堡+咖啡:37.5元/份");
        System.out.println("9. 套餐三:可乐+薯条:21.5元/份");
        System.out.println("--------------------------------------------------------------");
        System.out.println("请选择餐品序号");

//调用FoodControler 函数Server()
// FoodControler foodControler =new FoodControler();
        while(true){

            foodControler.service();

            System.out.println("您所点的商品如下 :");
            System.out.println(foodControler.foodList);
            System.out.println("您当前订单金额为:"+moneyAnalyze.getMoneyCount(foodControler.foodList)+"元");
//            System.out.println(foodControler.foodList.isEmpty());//测试列表空否
            chooseQuit();
            break;


        }

    }
    public void chooseQuit() throws IOException {//点餐界面离开选项
        System.out.println("继续:【Y】  结算:【S】  返回【A】");
        System.out.println("请输入服务类型:");
        Scanner sc = new Scanner(System.in);
        String item =sc.nextLine();
        while (true) {
            if (item.equals("A") || item.equals("a")) {
                interFace();
                break;
            } else if (item.equals("Y") || item.equals("y")) {

                System.out.println(foodControler.foodList);
//                System.out.println("您当前订单金额为:"+moneyAnalyze.getMoneyCount(foodControler.foodList));

                orderMeal();
                break;
            } else if (item.equals("S") || item.equals("s")) {
                settlement();
                break;


            } else {
                System.out.println("您所选择的服务不存在,请重新输入:");
                chooseQuit();
                break;
            }
        }
    }
    public void getTickets(){

        if(moneyAnalyze.getMoneyCount(foodControler.foodList)<50){
            System.out.println("您的订单无法领取优惠券");
        }
        if(moneyAnalyze.getMoneyCount(foodControler.foodList)>50&&moneyAnalyze.getMoneyCount(foodControler.foodList)<80){
            tickets=3.6;
            System.out.println("您的订单可以领取3.6元优惠券");
        }else if(moneyAnalyze.getMoneyCount(foodControler.foodList)>80){
            tickets=5.0;
            System.out.println("您的订单可以领取5元优惠券");
        }

    }

    /**
     * 通过消费判定折扣
     */
    public void settlement() throws IOException {

        System.out.println("您的付款金额:");
        Scanner sc = new Scanner(System.in);
        Double inMoney = sc.nextDouble();

        if(moneyAnalyze.getMoneyCount(foodControler.foodList)>50){
            //tickets= 3.6;
            disCount=0.86;
        }else if(moneyAnalyze.getMoneyCount(foodControler.foodList)>80){
            //tickets=5;
            disCount=0.75;
        }

        System.out.println("您本次消费如下:");
        getTickets();
        System.out.println("您本次消费:"+moneyAnalyze.getMoneyCount(foodControler.foodList));

        System.out.println("优惠:"+tickets+" 元");
        System.out.println("折扣:"+disCount*10+" 折");
        System.out.println("折后消费:"+(moneyAnalyze.getMoneyCount(foodControler.foodList)*disCount));
        System.out.println("收您:"+inMoney+" 元");

        System.out.println("找零:"+(moneyAnalyze.getChange(inMoney,moneyAnalyze.getMoneyCount(foodControler.foodList)*disCount-tickets))+" 元");

        moneyAnalyze.receipt(foodControler.foodList,disCount,tickets);//调用函数打印小票

    }



}

package kfc.order.control;
import java.io.IOException;



public class StartKFC  {

    public static void main(String[] args) throws IOException {
        MainApp mainApp = new MainApp();

        mainApp.interFace();




    }
}
//工厂模式算法源自CSDN 博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值