模拟肯德基快餐店收银系统

一、算法设计思路

1、所用类:
在这里插入图片描述
2、食品类类图:
在这里插入图片描述
3、工厂类类图:
在这里插入图片描述

二、主要函数实现

1、单品的接口

/**
 * 所有单品的接口
 * 随后添加的单品类只需要implements此接口并实现其方法
 * 定义打印输出不同单品的相关信息
 */
public interface Food {
	/**
     * 打印输出食物信息
     */
    void printMessage();

}

2、单品基本信息抽象类

/**
 * 单品抽象基类
 * 定义单品的共同属性
 */
public class AbstractFood {
	//类别
    protected String kind;
    //数量
    protected int num;
    //价格
    protected float price;
    //合计
    public float totalPrice(){
        return this.num * this.price;
    }
}

3、单品抽象工厂

/**
 * 肯德基抽象工厂:生产抽象食物
 * 抽象工厂中创建各种食物,都是抽象食物。
 */
public interface Factory {
	public interface factory {
	    //生产汉堡
	    public Hamburger createHamburger(int num);
	    //生产炸鸡类食物
	    public Chicken createChicken(int num);
	    //生产甜点
	    public Dessert createDessert(int num);
	    //生产饮品
	    public Drinks createDrinks(int num);
	}
}

4、实例工厂,生产具体食物

//KFC实际工厂,生产具体食物
public class KFCFactory implements Factory{
	 //生产香辣鸡腿堡
	public ZingerBurger createZingerBurger(int num) {
        return new ZingerBurger(num);
    }
	//生产嫩牛五方
    public BeefBurger createBeefBurger(int num) {
        return new BeefBurger(num);
    }
    //奥尔良烤鸡腿堡
    public OrleansBurger createOrleansBurger(int num) {
        return new OrleansBurger(num);
    }
    //生产老北京鸡肉卷			    //奥尔良烤翅
    //香辣鸡翅						//鸡米花
    //生产薯条						//生产蛋挞
    //生产圣代						//生产柠檬红茶
    //生产可乐						//生产雪顶咖啡
    //生产单人套餐
    public OneCombo createOneCombo(int num){
    	return new OneCombo(num);
    }
    //生产双人套餐					//生产三人套餐
}

5、点餐时,就向KFC(工厂)请求

/**
 * Customer类可通过构造方法将KFC实际工厂传入
 * 点餐时,就向KFC(工厂)请求,Customer不生产食物(不使用new生成对象)
 */
public class Customer {
    //抽象工厂
    private Factory factory;
    //构造方法将抽象工厂作为参数传入
    public Customer(Factory factory){
        this.factory = factory;
    }
    /**
     * 点餐
     */
    public float orderZingerBurger(int num){
        //获得香辣鸡腿堡
        Hamburger zingerBurger = factory.createZingerBurger(num);
        //输出订购信息
        zingerBurger.printMessage();
        //返回总价
        return zingerBurger.totalPrice();
    }
    public float orderBeefBurger(int num){
        //获得嫩牛五方
        Hamburger beefBurger = factory.createBeefBurger(num);
        //输出订购信息
        beefBurger.printMessage();
        //返回总价
        return beefBurger.totalPrice();
    }
        //获得奥尔良烤鸡腿堡				//获得老北京鸡肉卷
        //获得奥尔良烤翅					//获得香辣鸡翅
        //获得鸡米花						//获得薯条
        //获得蛋挞				        //获得圣代
        //获得奶茶				        //获得可乐
        //获得雪顶咖啡
	public float orderOneCombo(int num) {
		//单人套餐
		Combo oneCombo = factory.createOneCombo(num);
		//输出订购信息
		oneCombo.printMessage();
        //返回总价
        return oneCombo.totalPrice();
	}
		//双人套餐						//三人套餐
}

6、点餐类

import java.util.Scanner;
public class KFCtest {
	private static Scanner input;
	public static void main(String[] args) {
        /**
         * 定义一个肯德基(factory类型)
         */
        Factory factory = new KFCFactory();
        /**
         * 创建客户
         */
        Customer customer = new Customer(factory);
        input = new Scanner(System.in);
        float ZingerBurger = 0;float OrleansBurger= 0;
        float BeefBurger= 0;float BeijingChicken = 0;
        float ChickenWings= 0;float SpicyWings = 0;
        float PopcornChicken = 0; float Chips= 0;
        float EggTart= 0;float Sundae = 0;
        float Cola= 0; float BlackTea= 0;
        float Coffee = 0;float OneCombo= 0;
        float TwoCombo= 0;float ThreeCombo = 0;
//输出菜单
while(true){
        	System.out.println("请选择序号点餐:>");
            int a=input.nextInt();
            System.out.println("请选择数量:>");
            int b=input.nextInt();
            switch(a){
            case 1:
            	//香辣鸡腿堡
            	ZingerBurger = customer.orderZingerBurger(b);
                break;
            ........
            case 14: 
                //单人套餐
                OneCombo = customer.orderOneCombo(b);
                break;
            case 15: 
                //双人套餐
                TwoCombo = customer.orderTwoCombo(b);
                break;
            case 16: 
                //三人套餐
                ThreeCombo = customer.orderThreeCombo(b);
                break;
default:
            		System.out.println("对不起,您所选择的餐品错误");
            		break;
            }
            System.out.println("请选择是否继续点餐(1.是   2.否):>");
            int c=input.nextInt();
            if(c!=1){
            	break;
            }
        }
        float money1=ZingerBurger+OrleansBurger+BeefBurger+BeijingChicken;
        float money2=+ChickenWings+SpicyWings+PopcornChicken;
        float money3=+Chips+EggTart+Sundae;
        float money4=Cola+BlackTea+Coffee;
        float money5=OneCombo+TwoCombo+ThreeCombo;
        float money=money1+money2+money3+money4+money5;
        System.out.println("此次点餐共计:"+money);
        System.out.println("请问您是否具有优惠券? (1.是   2.否):>");
        int c=input.nextInt();
        int d=0;
        if(c==1){
        	System.out.println("请输入优惠券金额:>");
        	d=input.nextInt();
        }
        System.out.println("请输入实付金额:>");
        int e=input.nextInt();
        float changes=e-(money-d);        
System.out.println("找零:"+changes);
        System.out.println("欢迎下次点餐,祝您用餐愉快!");
    }
}

三、结果截图

1、菜单界面:
在这里插入图片描述
2、单点商品,无优惠券的结果显示:
在这里插入图片描述
3、点套餐,并且使用优惠券的结果:
在这里插入图片描述

四、调试截图

1、点餐调试:
在这里插入图片描述
2、结账并且使用优惠券:

在这里插入图片描述

五、总结

本次作业中,我们使用了工厂方法模式和抽象工厂模式两种设计模式,并应用了“开闭”原则和“依赖倒置”原则。
肯德基实例工厂——生产食物的工厂;食物(汉堡、鸡翅、薯条、可乐等等)——工厂生产的产品;顾客——点餐;用户——使用点餐系统为顾客点餐及结账。
肯德基店就是一个具体的工厂,此时,我们需要抽象一个工厂,在抽象工厂中指明了生产各种抽象食物的方法,如生产汉堡、鸡翅等。肯德基店就需要实现这个抽象工厂,生产具体的食品,如生产麻辣鸡腿汉堡、生产奥尔良鸡翅等。
前面提到了“抽象食物”,我们还需要对每个具体的食物添加抽象父类,如汉堡就是抽象父类,香辣鸡腿汉堡就是汉堡的一个子类,依次类推。这时,我们会发现,每一种食物又都存在着一些共同的属性,如风味、单价、数量等,因此,我们继续进行抽象,所有的抽象食物都继承一个抽象父类。如何订购肯德基生产的食物呢?这与工厂方法模式有所不同,这里我们使用组合的方式,将抽象工厂作为顾客类中的一个实例变量,顾客需要任何产品的时候,只需要向工厂请求即可,这就是抽象工厂模式的应用方式。顾客类和工厂类分开,客户无须修改就可以获得新产品。

参考网站:https://www.cnblogs.com/danielleee/p/8567124.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值