1.题目
请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能:
1.正常餐品结算和找零。
2.基本套餐结算和找零。
3.使用优惠劵购买餐品结算和找零。
4.可在一定时间段参与店内活动(自行设计或参考官网信息)。
5.模拟打印小票的功能(写到文件中)。
基本要求:
1.程序设计风格良好,控制台界面友好,最多两人一组完成任务。
2.实现功能测试代码,确保程序的健壮性。
3.画出使用的设计模式图。
2.题目分析
使用抽象工厂模式,设置抽象父类AbstractBaseFood,其中定义点餐数量,种类以及价格属性,接口IFood中定义方法printMessage(),定义抽象类Baverage,hamburg,ChickenWing,FrenchFries继承AbstractBaseFood,并实现接口IFood.ChinaBaverage,ChinaHamburg,ChinaChickenWings,ChinaFrenchFries又分别是对应抽象类的子类。接口IKfcFactory中定义函数Hamburg createHamburg();FrenchFries Beverage createBeverage();它的的实现工厂ChinaKfcFactory,China类型的食物作为其入口参数,从而制造出具体食物。在Customer类中定义文件写入函数showbill(),定义String数组,将不同的订购信息存入数组,利用数组循环写入文件。同时在该类中定义一个套餐。在MainApp中根据定义规定的活动优惠时间,获取系统当前时间,若当前时间在活动范围内,则给与优惠,再者,实际付款金额还和是否有优惠券有关,所以在计算实际付款和找零还应在从这两方面进行判断,用户通过Scanner in =new Scanner(System.in);int a=in.nextInt();输入订购食物数量。最后将顾客的订购信息包括用餐日期与所享优惠也一并打印出来并调用showbill()函数存入文件中。
4.设计模式图
5.部分源代码
package com.demo.factory.itf;
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 interface IKfcFactory
{
// 生产汉堡
public Hamburg createHamburg(int num);
// 生产薯条
public FrenchFries createFrenchFries(int num);
// 生产鸡翅
public ChickenWings createChickenWings(int num);
// 生产饮料
public Beverage createBeverage(int num);
}
ChinaKfcFactory
package com.demo.factory.itf;
import com.demo.factory.model.Beverage;
import com.demo.factory.model.ChickenWings;
import com.demo.factory.model.FrenchFries;
import com.demo.factory.model.Hamburg;
import com.demo.factory.model.kfc.ChinaBeverage;
import com.demo.factory.model.kfc.ChinaChickenWings;
import com.demo.factory.model.kfc.ChinaFrenchFries;
import com.demo.factory.model.kfc.ChinaHanburm;
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);
}
}
AbstractBaseFood
package com.demo.factory.model;
public abstract class AbstractBaseFood {
// 类别
protected String kind;
// 数量
protected int num;
// 价格
protected float price;
// 合计
public float totalPrice()
{
return this.num * this.price;
}
}
Beverage,其它几个和其类似
package com.demo.factory.model;
public abstract class Beverage extends AbstractBaseFood implements IFood
{
public String printMesage()
{
return("--" + this.kind + "饮料,\t单价:" + this.price + ",\t数量:" + this.num + ",\t合计:" + this.totalPrice());
}
}
ChinaBeverage,其它几个和其类似
package com.demo.factory.model.kfc;
import com.demo.factory.model.Beverage;
// 饮料实现类
public class ChinaBeverage extends Beverage
{
public ChinaBeverage(int num)
{
this.kind = "可乐";
this.price = 6.0f;
this.num = num;
}
}
Customer
package com.demo.factory.custom;
import com.demo.factory.itf.IKfcFactory;
import com.demo.factory.model.Beverage;
import com.demo.factory.model.ChickenWings;
import com.demo.factory.model.FrenchFries;
import com.demo.factory.model.Hamburg;
import java.io.*;
// 客户类
public class Customer
{
// 抽象工厂
private IKfcFactory kfcFactory;
// 构造方法将抽象工厂作为参数传入
public Customer(IKfcFactory kfcFactory)
{
this.kfcFactory = kfcFactory;
}
/**
* 订购食物
*/
private String s[] =new String[5];
public void showbill() throws IOException{
BufferedWriter bw=new BufferedWriter(new FileWriter("lili.txt",true));
bw.write("---------------------账单如下---------------------");
bw.newLine();
for(int i=0;i<5;i++){
bw.write(s[i]);
bw.newLine();
bw.flush();
}
}
// 订购麻辣鸡腿汉堡
public float orderHamburg(int num) throws IOException
{
// 获得麻辣鸡腿汉堡
Hamburg hamburg = kfcFactory.createHamburg(num);
// 输出订购信息
System.out.print(hamburg.printMesage());
s[0]=hamburg.printMesage();
System.out.print("\n");
// 返回总价
return hamburg.totalPrice();
}
// 订购奥尔良烤鸡翅
public float orderChickenWings(int num)
{
// 获得奥尔良烤鸡翅
ChickenWings chickenWings = kfcFactory.createChickenWings(num);
// 输出订购信息
System.out.print(chickenWings.printMesage());
s[1]=chickenWings.printMesage();
System.out.print("\n");
// 返回总价
return chickenWings.totalPrice();
}
// 订购薯条
public float orderFrenchFries(int num)
{
// 获得薯条
FrenchFries frenchFries = (FrenchFries) ((IKfcFactory) kfcFactory).createFrenchFries(num);
// 输出订购信息
System.out.print(frenchFries.printMesage());
s[2]=frenchFries.printMesage();
System.out.print("\n");
// 返回总价
return frenchFries.totalPrice();
}
// 订购可乐
public float orderBeverage(int num)
{
// 获得可乐
Beverage beverage = kfcFactory.createBeverage(num);
// 输出订购信息
System.out.print(beverage.printMesage());
s[3]=beverage.printMesage();
return beverage.totalPrice();
}
public float ordercombo1(int a5) {
int num=0;
Beverage beverage = kfcFactory.createBeverage(num);
// 获得麻辣鸡腿汉堡
Hamburg hamburg = kfcFactory.createHamburg(num);
s[4]=("--套餐一,\t单价:21,\t数量:"+num+"\t\t合计:"+(beverage.totalPrice()+hamburg.totalPrice())+"\n");
System.out.print("--套餐一,\t单价:21,\t数量:"+num+"\t\t合计:"+(beverage.totalPrice()+hamburg.totalPrice())+"\n");
return beverage.totalPrice()+hamburg.totalPrice();
}
}
MainApp
package com.demo.factory;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
import com.demo.factory.custom.Customer;
import com.demo.factory.itf.ChinaKfcFactory;
import com.demo.factory.itf.IKfcFactory;
import java.io.*;
public class MainApp
{
/**
* 主应用程序方法
*
* @param args
*/
public static void main(String[] args) throws Exception
{ int edu=0;
int huodong=3;
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("2018-10-25 1:59:59");
date3=f.parse("2019-10-27 1:59:59");
if(date1.getTime()>date2.getTime()&date1.getTime()<date3.getTime()){//数据比较
huodong=3;
}
else{
huodong=0;
}
/**
* 定义一个肯德基(IKfcFactory类型)
*/
BufferedWriter bw=new BufferedWriter(new FileWriter("lili.txt",true));
IKfcFactory kfcFactory = (IKfcFactory) new ChinaKfcFactory();
Customer customer = new Customer(kfcFactory);
/**
* 开始点餐
*/
// 一个麻辣鸡腿汉堡
Scanner in =new Scanner(System.in);
System.out.print("-----今日菜单-----\n");
System.out.print("--麻辣风味汉堡\t单价:15.0.\n--奥尔良风味鸡翅\t单价:3.0\n--普通风味薯条\t单价:8.0\n--可乐饮料\t单价:6.0\n--套餐一(麻辣风味汉堡+可乐饮料)\t单价:21\n");
System.out.print("\n-----------------------");
System.out.print("\n请点餐:\n");
System.out.print("麻辣风味汉堡数量:");
int a1=in.nextInt();
System.out.print("奥尔良风味鸡翅数量:");
int a2=in.nextInt();
System.out.print("普通风味薯条数量:");
int a3=in.nextInt();
System.out.print("可乐饮料数量:");
int a4=in.nextInt();
System.out.print("套餐份数:");
int a5=in.nextInt();
System.out.print("\n------账单如下-----\n");
float hamhurgMoney = customer.orderHamburg(a1);
// 四个奥尔良烤鸡翅
float chickenWingsMoney = customer.orderChickenWings(a2);
// 一包薯条
float frenchFriesMoney = customer.orderFrenchFries(a3);
// 两杯可乐
float beverageMoney = customer.orderBeverage(a4);
float combo1=customer.ordercombo1(a5);
//总价
float sum=hamhurgMoney + chickenWingsMoney + frenchFriesMoney + beverageMoney+combo1;
System.out.println("总计:" + (sum));
bw.write("总计: "+sum);
bw.newLine();
System.out.print("请输入付款金额:");
int a=in.nextInt();
bw.write("付款:"+a);
bw.newLine();
System.out.println("请输入是否有优惠券(1/0)");
int discount=in.nextInt();
if(discount==1){
System.out.println("请输入优惠券额度");
edu=in.nextInt();
}
double y=a+edu-sum+huodong;
System.out.println("消费日期:"+date1);
if(huodong==3){
System.out.println(" 您的付款额为"+a+"\n 优惠券额度为"+edu+"\n目前您可参与店内满5减3的活动"+ " \n 共收取您"+(sum-edu-huodong)+" \n 您的找零为"+y);
bw.write("您的优惠券额度为:"+edu);
bw.write("目前您可参加店内满5减3的活动");
bw.write("找零:"+y);
bw.newLine();
}
else{
System.out.println(" 您的付款额为"+a+"\n 优惠券额度为"+edu+"\n目前暂无店内活动参与"+ " \n 共收取您"+(sum-edu-huodong)+" \n 您的找零为"+y);
bw.write("您的优惠券额度为:"+edu);
bw.write("目前无店内活动");
bw.write("找零:"+y);
bw.newLine();
}
customer.showbill();
bw.write("消费日期"+date1);
bw.newLine();
bw.flush();
bw.close();
}
}
6.调试及运行截图
调试:
运行:
写入文件
7.总结
在本次实验中,我运用的设计模式是抽象模式,在所以也对抽象模式有了更深的体会。在此过程中也对Java中写入文件有了练习,之前都是一个简单的string字符串写入,这次是不同函数的输出内容,通过数组形式写入。还有就是对系统日期类获取当前时间有了编写,这个作业就相当于是练习练习了Java,在设计模式上运用的还不是很熟练,辗转反侧也只是用到了抽象工厂模式,对于其他设计模式还是很生疏,并且还是在参考脚本之家网站上做了一部分改进,头昏。。。。加油,下去多多练习其他模式。。