java基础版肯德基收银系统(工厂模式)

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

设计模式图
在这里插入图片描述

`package com.demo.factory.model;
/**
 *
 * 食物基类
 *
 * @author maofw
 *
 */
public abstract class AbstractBaseFood
{
    // 类别
    protected String kind;
    // 数量
    protected int num;
    // 价格
    protected float price;

    // 合计
    public float totalPrice()
    {
        return this.num * this.price;
    }
package com.demo.factory.model;

/**
 * 饮料基类
 *
 * @author maofw
 *
 */
public abstract class Beverage extends AbstractBaseFood implements IFood
{

    public void printMesage()
    {
        System.out.println("--" + this.kind + "饮料,\t单价:" + this.price + ",\t数量:" + this.num + ",\t合计:" + this.totalPrice());
    }
}
package com.demo.factory.model;
/**
 * 鸡翅基类
 *
 * @author maofw
 *
 */
public abstract class ChickenWings extends AbstractBaseFood implements IFood
{

    public void printMesage()
    {
        System.out.println("--" + this.kind + "风味鸡翅,\t单价:" + this.price + ",\t数量:" + this.num + ",\t合计:" + this.totalPrice());
    }

}

package com.demo.factory.model;
import com.demo.factory.model.Beverage;

/**
 * 饮料实现类
 *
 * @author maofw
 *
 */
public class ChinaBeverage extends Beverage
{

    public ChinaBeverage(int num)
    {
        this.kind = "可乐";
        this.price = 7.0f;
        this.num = num;
    }
}

package com.demo.factory.model;
import com.demo.factory.model.ChickenWings;

/**
 * 鸡翅实现类
 *
 * @author maofw
 *
 */
public class ChinaChickenWings extends ChickenWings
{
    public ChinaChickenWings(int num)
    {
        this.kind = "奥尔良";
        this.price = 2.5f;
        this.num = num;
    }
}
package com.demo.factory.model;
import com.demo.factory.model.FrenchFries;

/**
 * 薯条实现类
 *
 * @author maofw
 *
 */

public class ChinaFrenchFries extends FrenchFries
{
    public ChinaFrenchFries(int num)
    {
        this.kind = "普通";
        this.price = 8.0f;
        this.num = num;
    }
}
package com.demo.factory.model;
import com.demo.factory.model.Hamburg;

/**
 * 中国风味的麻辣鸡腿汉堡
 *
 * @author maofw
 *
 */
public class ChinaHanburm extends Hamburg
{
    /**
     * 构造方法
     */
    public ChinaHanburm(int num)
    {
        this.kind = "麻辣";
        this.price = 14.0f;
        this.num = num;
    }
}

package com.demo.factory.model;
import com.demo.factory.model.Beverage;
import com.demo.factory.model.ChickenWings;
import com.demo.factory.model.FrenchFries;
import com.demo.factory.model.Hamburg;
public class ChinaKfcFactory implements IKfcFactory
{

    // 生产可乐
    public Beverage createBeverage(int num)
    {
        return new ChinaBeverage(num);
    }

    // 生产奥尔良烤鸡翅
    public ChickenWings createChickenWings(int num)
    {
        return new ChinaChickenWings(num);
    }

    // 生产薯条
    public FrenchFries createFrenchFries(int num)
    {
        return new ChinaFrenchFries(num);
    }

    // 生产麻辣风味鸡腿汉堡
    public Hamburg createHamburg(int num)
    {
        return new ChinaHanburm(num);
    }

}

package com.demo.factory.model;
import com.demo.factory.model.Beverage;
import com.demo.factory.model.ChickenWings;
import com.demo.factory.model.FrenchFries;
import com.demo.factory.model.Hamburg;

/**
 * 客户类
 *
 * @author maofw
 *
 */
public class Customer
{
    // 抽象工厂
    private IKfcFactory kfcFactory;

    // 构造方法将抽象工厂作为参数传入
    public Customer(IKfcFactory kfcFactory)
    {
        this.kfcFactory = kfcFactory;
    }

    /**
     * 订购食物
     */
    // 订购麻辣鸡腿汉堡
    public float orderHamburg(int num)
    {
        // 获得麻辣鸡腿汉堡
        Hamburg hamburg = kfcFactory.createHamburg(num);
        // 输出订购信息
        hamburg.printMesage();
        // 返回总价
        return hamburg.totalPrice();
    }

    // 订购奥尔良烤鸡翅
    public float orderChickenWings(int num)
    {
        // 获得奥尔良烤鸡翅
        ChickenWings chickenWings = kfcFactory.createChickenWings(num);
        // 输出订购信息
        chickenWings.printMesage();
        // 返回总价
        return chickenWings.totalPrice();
    }

    // 订购薯条
    public float orderFrenchFries(int num)
    {
        // 获得薯条
        FrenchFries frenchFries = kfcFactory.createFrenchFries(num);
        // 输出订购信息
        frenchFries.printMesage();
        // 返回总价
        return frenchFries.totalPrice();
    }

    // 订购可乐
    public float orderBeverage(int num)
    {
        // 获得可乐
        Beverage beverage = kfcFactory.createBeverage(num);
        // 输出订购信息
        beverage.printMesage();
        // 返回总价
        return beverage.totalPrice();
    }
}

package com.demo.factory.model;
import java.util.Date;
import java.util.Scanner;
import java.text.SimpleDateFormat;
import java.text.ParseException;
public class CustomerOrder {
    public static void main(String[] args) throws ParseException{
        int diancan=1;
        double sum=0;
        double sumt=0;
        int edu=0;
        int huodong=3;
        int num=-1;//用户输入0返回菜单

        //获取当前时间并与开业时间进行比较确定是否可以参加活动
        Date date1=new Date();
        Date date2=new Date();
        Date date3=new Date();
        SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        date1=f.parse(f.format(new Date())); //这是获取当前时间
        date2=f.parse("2019-05-11 1:59:59");
        date3=f.parse("2020-05-11 1:59:59");
        if(date1.getTime()>date2.getTime()&date1.getTime()<date3.getTime()){//数据比较
            huodong=3;
        }
        else{
            huodong=0;
        }

        /**
         * 定义一个肯德基(IKfcFactory类型)
         */
        IKfcFactory iKfcFactory = new ChinaKfcFactory();

        /**
         * 创建客户
         */
        Customer customer = new Customer(iKfcFactory);

        /**
         * 客户开始点餐
         */
        Scanner sc=new Scanner(System.in);


        System.out.println("\t欢迎使用KFC点餐系统");
        do{
            System.out.println("**************************************");
            System.out.println("\t1、单品点餐\t");
            System.out.println("\t2、套餐点餐");
            System.out.println("\t3、查看单品菜单");
            System.out.println("\t4、查看套餐菜单");
            System.out.println("\t5、了解店铺活动");
            System.out.println("**************************************");
            System.out.println("请选择:");
            int choose = sc.nextInt();
            switch(choose){
                case 1:
                    System.out.println("**************"+"\n"+"1.香辣鸡腿堡\n"+"2.薯条\n"+"3.冰激凌\n"+"4.可乐\n"+"**************");
                    while(diancan==1){
                        @SuppressWarnings("deprecation")
                        String shijian=new Date().toLocaleString();

                        System.out.println("是否继续点餐(y/n)");
                        String dianbudian=sc.next();
                        if(dianbudian.equals("n")){
                            System.out.println("您的点餐时间为"+shijian);
                            System.out.println("您的总消费为"+sum);
                            System.out.println("请输入付款金额");
                            int fukuan=sc.nextInt();
                            System.out.println("请输入是否有优惠券(1/0)");
                            int youhuiquan=sc.nextInt();
                            if(youhuiquan==1){
                                System.out.println("请输入优惠券额度");
                                edu=sc.nextInt();
                            }
                            double zhaoling=fukuan+edu-sum+huodong;
                            if(huodong==3){
                                System.out.println(" 您的付款额为"+fukuan+"\n 优惠券额度为"+edu+"\n目前您可参与店内满5减3的活动"+ " \n 共收取您"+(sum-edu-huodong)+" \n 您的找零为"+zhaoling);
                            }
                            else{
                                System.out.println(" 您的付款额为"+fukuan+"\n 优惠券额度为"+edu+"\n目前暂无店内活动参与"+ " \n 共收取您"+(sum-edu-huodong)+" \n 您的找零为"+zhaoling);
                            }

                            break;
                        }
                        System.out.println("请输入所选食物编号");
                        int choice=sc.nextInt();
                        System.out.println("数量");
                        int jifen1=sc.nextInt();
                        if(choice==1){
                            float sum1 = customer.orderHamburg(jifen1);
                            sum +=sum1;
                        }
                        else if(choice==2){
                            float sum2 = customer.orderFrenchFries(jifen1);
                            sum +=sum2;
                        }
                        else if(choice==3){
                            float sum3 = customer.orderChickenWings(jifen1);
                            sum +=sum3;
                        }

                        else if(choice==4){
                            float sum4 = customer.orderBeverage(jifen1);
                            sum +=sum4;
                        }
                        System.out.println("总花费"+sum);
                    }
                    break;
                case 2:
                    System.out.println("1.套餐1:");
                    System.out.println("\t**香辣鸡腿堡 *1**\n\t**薯条 *1**\n\t**冰激凌 *1**\n");
                    System.out.println("2.套餐2:");
                    System.out.println("\t**香辣鸡腿堡 *1\n\t**薯条 *1**\n\t**可乐 *1**\n");
                    System.out.println("3.套餐3:");
                    System.out.println("\t**香辣鸡腿堡 *2**\n\t**薯条 *1**\n\t**冰激凌 *1**\n\t**可乐 *1**\n");
                    while(diancan==1){
                        @SuppressWarnings("deprecation")
                        String shijian=new Date().toLocaleString();
                        System.out.println("是否继续点餐(y/n)");
                        String dianbudian=sc.next();
                        if(dianbudian.equals("n")){
                            System.out.println("您的点餐时间为"+shijian);
                            System.out.println("您的总消费为"+sum);
                            System.out.println("请输入付款金额");
                            int fukuan=sc.nextInt();
                            System.out.println("请输入是否有优惠券(1/0)");
                            int youhuiquan=sc.nextInt();
                            if(youhuiquan==1){
                                System.out.println("请输入优惠券额度");
                                edu=sc.nextInt();
                            }
                            double zhaoling=fukuan+edu-sum+huodong;
                            if(huodong==3){
                                System.out.println(" 您的付款额为"+fukuan+"\n 优惠券额度为"+edu+"\n目前您可参与店内满5减3的活动"+ " \n 共收取您"+(sum-edu-huodong)+" \n 您的找零为"+zhaoling);
                            }
                            else{
                                System.out.println(" 您的付款额为"+fukuan+"\n 优惠券额度为"+edu+"\n目前暂无店内活动参与"+ " \n 共收取您"+(sum-edu-huodong)+" \n 您的找零为"+zhaoling);
                            }

                            break;
                        }
                        System.out.println("请输入所选食物编号");
                        int choice=sc.nextInt();
                        System.out.println("数量");
                        int jifen1=sc.nextInt();
                        if(choice==1){
                            float sum1 = customer.orderHamburg(jifen1);
                            float sum2 = customer.orderFrenchFries(jifen1);
                            float sum3 = customer.orderChickenWings(jifen1);
                            sum +=(sum1+sum2+sum3);
                            sumt +=sum;
                        }
                        else if(choice==2){
                            float sum1 = customer.orderHamburg(jifen1);
                            float sum2 = customer.orderFrenchFries(jifen1);
                            float sum4 = customer.orderBeverage(jifen1);
                            sum +=(sum2+sum4+sum1);
                            sumt +=sum;
                        }
                        else if(choice==3){
                            float sum1 = customer.orderHamburg(jifen1);
                            float sum2 = customer.orderFrenchFries(jifen1);
                            float sum3 = customer.orderChickenWings(jifen1);
                            float sum4 = customer.orderBeverage(jifen1);
                            sum +=(sum1*2+sum2+sum3);
                            sumt +=sum;
                        }
                        System.out.println("总花费"+sumt);
                    }
                    break;

                case 3:
                    System.out.println("**************"+"\n"+"1.香辣鸡腿堡\n"+"2.薯条\n"+"3.鸡翅\n"+"4.饮料\n"+"**************");
                    break;
                case 4:
                    System.out.println("1.套餐1:");
                    System.out.println("\t**香辣鸡腿堡 *1**\n\t**薯条 *1**\n\t**鸡翅 *1**\n");
                    System.out.println("2.套餐2:");
                    System.out.println("\t**香辣鸡腿堡 *1\n\t**薯条 *1**\n\t**饮料 *1**\n");
                    System.out.println("3.套餐3:");
                    System.out.println("\t**香辣鸡腿堡 *2**\n\t**薯条 *1**\n\t**鸡翅 *1**\n\\t**饮料 *1**\\n");
                    break;
                case 5:System.out.println("亲,本店正值开业周年庆庆,为答谢广大顾客的支持,"
                        + "\n本店决定凡在2019-05-11至2020-05-11内在本店消费的顾客"
                        + "\n可享受满5元减3元的活动!!!!!!!");
                    break;
            }
        }while(num==0);
    }
}

package com.demo.factory.model;
/**
 * 薯条基类
 *
 * @author maofw
 *
 */
public abstract class FrenchFries extends AbstractBaseFood implements IFood
{
    public void printMesage()
    {
        System.out.println("--" + this.kind + "风味薯条,\t单价:" + this.price + ",\t数量:" + this.num + ",\t合计:" + this.totalPrice());
    }
}

package com.demo.factory.model;
/**
 * 汉堡基类
 *
 * @author maofw
 *
 */
public abstract class Hamburg extends AbstractBaseFood implements IFood
    {

    public void printMesage()
    {
        System.out.println("--" + this.kind + "风味汉堡,\t单价:" + this.price + ",\t数量:" + this.num + ",\t合计:" + this.totalPrice());
    }
}

package com.demo.factory.model;
/**
 * 抽象食物接口
 *
 * @author maofw
 *
 */
public interface IFood
{
    /**
     * 打印输出食物信息
     */
    void printMesage();
}

package com.demo.factory.model;
import com.demo.factory.model.Beverage;
import com.demo.factory.model.ChickenWings;
import com.demo.factory.model.FrenchFries;
import com.demo.factory.model.Hamburg;

/**
 * 肯德基抽象工厂基类
 *
 * @author maofw
 *
 */
public interface IKfcFactory
{
    // 生产汉堡
    public Hamburg createHamburg(int num);

    // 生产薯条
    public FrenchFries createFrenchFries(int num);

    // 生产鸡翅
    public ChickenWings createChickenWings(int num);

    // 生产饮料
    public Beverage createBeverage(int num);
}
 肯德基店就是一个具体的工厂,这时,我们需要抽象一个工厂,在抽象工厂中指明了生产各种抽象食物的方法,如生产汉堡、鸡翅等,肯德基店就需要实现这个抽象工厂,生产具体的食品,如生产麻辣鸡腿汉堡、生产奥尔良鸡翅等。前面提到了“抽象食物”,我们还需要对每个具体的食物添加抽象父类,如汉堡就是抽象父类,麻辣鸡腿汉堡就是汉堡的一个子类,依次类推。这时,我们会发现,每一种食物又都存在着一些共同的属性,如风味、单价、数量等,因此,我们继续进行抽象,所有的抽象食物都继承一个抽象父类。客户如何订购肯德基生产的食物呢?这与上一章的工厂方法模式有所不同,这里我们使用组合的方式,将抽象工厂作为客户类中的一个实例变量,客户需要任何产品的时候,只需要向工厂请求即可,这就是抽象工厂模式的应用方式。客户类和工厂类分开,客户无须修改就可以获得新产品. 客户类中使用的都是抽象类和接口,这样即使生产再多的食物都不用担心了。

在抽象工厂模式中,定义了一个抽象接口,如本例中的IKfcFactory,之后具体工厂又通过实现抽象工厂的各种接口方法创建实例对象,如本例中的ChinaKfcFactory,这不正是之前讲的工厂方法模式吗?的确,在抽象工厂模式中使用了工厂方法模式的实现方式。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值