一、问题描述
模拟肯德基快餐店的收银系统
合理使用Java结合设计模式(2种以上)至少实现系统的以下功能:
1.正常餐品结算和找零。
2.基本套餐结算和找零。
3.使用优惠劵购买餐品结算和找零。
4.可在一定时间段参与店内活动(自行设计或参考官网信息)。
5.模拟打印小票的功能(写到文件中)。
二、算法设计
采用两种设计模式:简单工厂模式,抽象工厂模式
对单独点餐采用简单工厂模式;对套餐采用抽象工厂模式
类图如下
图一:主食
图二:饮料
图三:小吃
图四:套餐
三、源代码
ChickenNeggets.java
package KFC;
public class ChickenNeggets implements Snack
{
public void Use()
{
System.out.println("鸡米花制作中...");
}
}
ChickenRolls.java
package KFC;
public class ChickenRolls implements StapleFood
{
public void Use()
{
System.out.println("鸡肉卷制作中...");
}
}
ChickenWings.java
package KFC;
public class ChickenWings implements Snack
{
public void Use()
{
System.out.println("鸡翅制作中...");
}
}
Client.java
package KFC;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Client
{
public static void main(String[] args) throws Exception
{
// TODO Auto-generated method stub
int[] select = new int[20];
MySwing my = new MySwing();
System.out.println("按1确认");
Scanner s = new Scanner(System.in);
int sn = s.nextInt();
while (MySwing.s)
{
select = my.Select();
// System.out.println(select);
StapleFood staplefood;
Drinks drinks;
Snack snack;
for (int i = 0; i < select.length; i++)
{
if (select[i] == 1 || select[i] == 2 || select[i] == 3)
{
staplefood = StapleFoodFactory.Use(select[i]);
try
{
staplefood.Use();
} catch (NullPointerException e)
{
System.out.println("没有选择主食!!");
}
}
if (select[i] == 4 || select[i] == 5 || select[i] == 6)
{
drinks = DrinksFactory.Use(select[i]);
try
{
drinks.Use();
} catch (NullPointerException e)
{
System.out.println("没有选择饮料!!");
}
}
if (select[i] == 7 || select[i] == 8 || select[i] == 9)
{
snack = SnackFactory.Use(select[i]);
try
{
snack.Use();
} catch (NullPointerException e)
{
System.out.println("没有选择小吃!!");
}
}
SetMealFactory factory;
if (select[i] == 10)
{
factory = new SetMeal1Factory();
staplefood = factory.produceStapleFood();
staplefood.Use();
drinks = factory.produceDrinks();
drinks.Use();
snack = factory.produceSnack();
snack.Use();
}
if (select[i] == 11)
{
factory = new SetMeal2Factory();
staplefood = factory.produceStapleFood();
staplefood.Use();
drinks = factory.produceDrinks();
drinks.Use();
snack = factory.produceSnack();
snack.Use();
}
if (select[i] == 12)
{
factory = new SetMeal3Factory();
staplefood = factory.produceStapleFood();
staplefood.Use();
drinks = factory.produceDrinks();
drinks.Use();
snack = factory.produceSnack();
snack.Use();
}
}
MySwing.s = false;
}
System.out.println("打印小票!!!");
if (receipt.creatTextFile())
{
for (int i = 0; i < select.length; i++)
{
if (select[i] == 1)
{
receipt.writeTxtFile("盖饭"+ "\n");
}
if (select[i] == 2)
{
receipt.writeTxtFile("汉堡"+ "\n");
}
if (select[i] == 3)
{
receipt.writeTxtFile("鸡肉卷"+ "\n");
}
if (select[i] == 4)
{
receipt.writeTxtFile("可乐"+ "\n");
}
if (select[i] == 5)
{
receipt.writeTxtFile("果汁"+ "\n");
}
if (select[i] == 6)
{
receipt.writeTxtFile("乌龙茶" + "\n");
}
if (select[i] == 7)
{
receipt.writeTxtFile("薯条" + "\n");
}
if (select[i] == 8)
{
receipt.writeTxtFile("鸡米花" + "\n");
}
if (select[i] == 9)
{
receipt.writeTxtFile("鸡翅" + "\n");
}
if (select[i] == 10)
{
receipt.writeTxtFile("套餐一(盖饭,可乐,薯条)" + "\n");
}
if (select[i] == 11)
{
receipt.writeTxtFile("套餐二(汉堡,果汁,鸡米花)" + "\n");
}
if (select[i] == 12)
{
receipt.writeTxtFile("套餐三(鸡肉卷,乌龙茶,鸡翅)" + "\n");
}
if (select[i] == 15)
{
receipt.writeTxtFile("使用八折优惠券" + "\n");
}
if (select[i] == 16)
{
receipt.writeTxtFile("使用满三十减五优惠券" + "\n");
}
if (select[i] == 17)
{
receipt.writeTxtFile("早餐时间 获得一元优惠券" + "\n");
}
if (select[i] == 18)
{
receipt.writeTxtFile("午餐时间 获得三元优惠券" + "\n");
}
}
DecimalFormat df = new DecimalFormat(".##");
String st;
st = df.format(my.sub);
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
receipt.writeTxtFile("\n\n\n" + "时间:" + format.format(date));
receipt.writeTxtFile("\n" + "合计:" + st + "\n");
}
System.out.println("结束!");
}
}
Coke.java
package KFC;
public class Coke implements Drinks
{
public void Use()
{
System.out.println("可乐制作中...");
}
}
Drinks.java
package KFC;
public interface Drinks
{
public void Use();
}
DrinksFactory.java
package KFC;
import java.util.Scanner;
public class DrinksFactory
{
public static Drinks Use(int select)
{
if (select == 4)
{
System.out.println("一份可乐!");
return new Coke();
} else if (select == 5)
{
System.out.println("一份果汁!");
return new Juice();
} else if (select == 6)
{
System.out.println("一份乌龙茶!");
return new Oolong();
}
return null;
}
}
Fries.java
package KFC;
public class Fries implements Snack
{
public void Use()
{
System.out.println("薯条制作中");
}
}
Hamburg.java
package KFC;
public class Hamburg implements StapleFood
{
public void Use()
{
System.out.println("汉堡制作中...");
}
}
Juice.java
package KFC;
public class Juice implements Drinks
{
public void Use()
{
System.out.println("果汁制作中...");
}
}
MySwing.java
package KFC;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class MySwing extends JFrame implements ActionListener
{
DecimalFormat df = new DecimalFormat(".##");
static double sub = 0;
static int[] select = new int[20];
static boolean s = false;
static int i = 0;
JLabel jl = new JLabel("主食" + "\n"); // 定义一个标签
JCheckBox jCheckBox_1 = new JCheckBox("盖饭——————12¥");
JCheckBox jCheckBox_2 = new JCheckBox("汉堡——————10¥");
JCheckBox jCheckBox_3 = new JCheckBox("鸡肉卷—————10¥");
JLabel j2 = new JLabel("饮料" + "\n"); // 定义一个标签
JCheckBox jCheckBox_4 = new JCheckBox("可乐——————6¥");
JCheckBox jCheckBox_5 = new JCheckBox("果汁———————7¥");
JCheckBox jCheckBox_6 = new JCheckBox("乌龙茶—————8¥");
JLabel j3 = new JLabel("小吃" + "\n"); // 定义一个标签
JCheckBox jCheckBox_7 = new JCheckBox("薯条——————6¥");
JCheckBox jCheckBox_8 = new JCheckBox("鸡米花——————7¥");
JCheckBox jCheckBox_9 = new JCheckBox("鸡翅——————9¥");
JLabel j4 = new JLabel("套餐" + "\n"); // 定义一个标签
JCheckBox jCheckBox_10 = new JCheckBox("套餐一(盖饭,可乐,薯条)—————22¥");
JCheckBox jCheckBox_11 = new JCheckBox("套餐二(汉堡,果汁,鸡米花)—————22¥");
JCheckBox jCheckBox_12 = new JCheckBox("套餐三(鸡肉卷,乌龙茶,鸡翅)—————24¥");
JLabel j6 = new JLabel("优惠券" + "\n"); // 定义一个标签
JCheckBox jCheckBox_15 = new JCheckBox("八折");
JCheckBox jCheckBox_16 = new JCheckBox("满三十减五");
JLabel j5 = new JLabel("点餐完毕!!"); // 定义一个标签
JCheckBox jCheckBox_13 = new JCheckBox("确定");
JCheckBox jCheckBox_14 = new JCheckBox("取消");
JLabel j7 = new JLabel("活动" + "\n"); // 定义一个标签
JCheckBox jCheckBox_17 = new JCheckBox("早餐时间(6:00~8:00),获得一元优惠券");
JCheckBox jCheckBox_18 = new JCheckBox("午餐时间(12:00~14:00),获得三元优惠券");
JTextArea jTextArea = new JTextArea();
// 定义构造器
public MySwing()
{
this.setTitle("菜单");
this.setBounds(100, 100, 500, 500); // 设置窗口的大小和位置
Container container = getContentPane();
JPanel jPanel = new JPanel();
jPanel.setLayout(new GridLayout(7, 2));
Box box_1, box_2, box_3, box_4, box_5, box_6,box_7;// 设置类别及多选框
box_1 = Box.createHorizontalBox();
box_2 = Box.createHorizontalBox();
box_3 = Box.createHorizontalBox();
box_4 = Box.createHorizontalBox();
box_5 = Box.createHorizontalBox();
box_6 = Box.createHorizontalBox();
box_7 = Box.createHorizontalBox();
box_1.add(Box.createHorizontalStrut(3));
box_1.add(jl);
box_1.add(jCheckBox_1);
box_1.add(jCheckBox_2);
box_1.add(jCheckBox_3);
box_2.add(Box.createHorizontalStrut(3));
box_2.add(j2);
box_2.add(jCheckBox_4);
box_2.add(jCheckBox_5);
box_2.add(jCheckBox_6);
box_3.add(Box.createHorizontalStrut(3));
box_3.add(j3);
box_3.add(jCheckBox_7);
box_3.add(jCheckBox_8);
box_3.add(jCheckBox_9);
box_4.add(Box.createHorizontalStrut(3));
box_4.add(j4);
box_4.add(jCheckBox_10);
box_4.add(jCheckBox_11);
box_4.add(jCheckBox_12);
ButtonGroup buttonGroup = new ButtonGroup();
buttonGroup.add(jCheckBox_13);
buttonGroup.add(jCheckBox_14);
box_7.add(Box.createHorizontalStrut(2));
box_7.add(j5);
box_7.add(jCheckBox_13);
box_7.add(jCheckBox_14);
buttonGroup.add(jCheckBox_15);
buttonGroup.add(jCheckBox_16);
box_5.add(Box.createHorizontalStrut(2));
box_5.add(j6);
box_5.add(jCheckBox_15);
box_5.add(jCheckBox_16);
buttonGroup.add(jCheckBox_17);
buttonGroup.add(jCheckBox_18);
box_6.add(Box.createHorizontalStrut(2));
box_6.add(j7);
box_6.add(jCheckBox_17);
box_6.add(jCheckBox_18);
jPanel.add(box_1);
jPanel.add(box_2);
jPanel.add(box_3);
jPanel.add(box_4);
jPanel.add(box_6);
jPanel.add(box_5);
jPanel.add(box_7);
container.add(jPanel, BorderLayout.NORTH);
JScrollPane jScrollPane = new JScrollPane(jTextArea);
container.add(jScrollPane, BorderLayout.CENTER);
jCheckBox_1.addActionListener(this);
jCheckBox_2.addActionListener(this);
jCheckBox_3.addActionListener(this);
jCheckBox_4.addActionListener(this);
jCheckBox_5.addActionListener(this);
jCheckBox_6.addActionListener(this);
jCheckBox_7.addActionListener(this);
jCheckBox_8.addActionListener(this);
jCheckBox_9.addActionListener(this);
jCheckBox_10.addActionListener(this);
jCheckBox_11.addActionListener(this);
jCheckBox_12.addActionListener(this);
jCheckBox_15.addActionListener(this);
jCheckBox_16.addActionListener(this);
jCheckBox_17.addActionListener(this);
jCheckBox_18.addActionListener(this);
jCheckBox_13.addActionListener(this);
jCheckBox_14.addActionListener(this);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(960, 300);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e)
{
// TODO Auto-generated method stub
// int i = 0;
if (e.getSource() == jCheckBox_1)
{
if (jCheckBox_1.isSelected() == true)
{
jTextArea.append("盖饭" + "\n");
sub += 12;
select[i] = 1;
i++;
}
} else if (e.getSource() == jCheckBox_2)
{
if (jCheckBox_2.isSelected() == true)
{
jTextArea.append("汉堡" + "\n");
sub += 10;
select[i] = 2;
i++;
}
} else if (e.getSource() == jCheckBox_3)
{
if (jCheckBox_3.isSelected() == true)
{
jTextArea.append("鸡肉卷" + "\n");
sub += 10;
select[i] = 3;
i++;
}
} else if (e.getSource() == jCheckBox_4)
{
if (jCheckBox_4.isSelected() == true)
{
jTextArea.append("可乐" + "\n");
sub += 6;
select[i] = 4;
i++;
}
} else if (e.getSource() == jCheckBox_5)
{
if (jCheckBox_5.isSelected() == true)
{
jTextArea.append("果汁" + "\n");
sub += 7;
select[i] = 5;
i++;
}
} else if (e.getSource() == jCheckBox_6)
{
if (jCheckBox_6.isSelected() == true)
{
jTextArea.append("乌龙茶" + "\n");
sub += 8;
select[i] = 6;
i++;
}
} else if (e.getSource() == jCheckBox_7)
{
if (jCheckBox_7.isSelected() == true)
{
jTextArea.append("薯条" + "\n");
sub += 6;
select[i] = 7;
i++;
}
} else if (e.getSource() == jCheckBox_8)
{
if (jCheckBox_8.isSelected() == true)
{
jTextArea.append("鸡米花" + "\n");
sub += 7;
select[i] = 8;
i++;
}
} else if (e.getSource() == jCheckBox_9)
{
if (jCheckBox_9.isSelected() == true)
{
jTextArea.append("鸡翅" + "\n");
sub += 9;
select[i] = 9;
i++;
}
} else if (e.getSource() == jCheckBox_10)
{
if (jCheckBox_10.isSelected() == true)
{
jTextArea.append("套餐一(盖饭,可乐,薯条)" + "\n");
sub += 22;
select[i] = 10;
i++;
}
} else if (e.getSource() == jCheckBox_11)
{
if (jCheckBox_11.isSelected() == true)
{
jTextArea.append("套餐二(汉堡,果汁,鸡米花)" + "\n");
sub += 22;
select[i] = 11;
i++;
}
} else if (e.getSource() == jCheckBox_12)
{
if (jCheckBox_12.isSelected() == true)
{
jTextArea.append("套餐三(鸡肉卷,乌龙茶,鸡翅)" + "\n");
sub += 24;
select[i] = 12;
i++;
}
} else if (e.getSource() == jCheckBox_13)
{
if (jCheckBox_13.isSelected() == true)
{
String st;
st = df.format(sub);
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
jTextArea.append("\n\n\n" + "时间:" + format.format(date) + "\n" + "合计:" + st + "\n");
s = true;
}
} else if (e.getSource() == jCheckBox_14)
{
if (jCheckBox_14.isSelected() == true)
{
jTextArea.setText(null);
sub = 0;
}
}else if (e.getSource() == jCheckBox_15)
{
if (jCheckBox_15.isSelected() == true)
{
jTextArea.append("使用八折优惠券!!" + "\n");
sub *= 0.8;
select[i] = 15;
}
} else if (e.getSource() == jCheckBox_16)
{
if (jCheckBox_16.isSelected() == true)
{
jTextArea.append("满30减5!!" + "\n");
if(sub>=30) {
sub -= 5;
select[i] = 16;
}else {
jTextArea.append("对不起,您的消费未满30元!" + "\n");
}
}
}else if (e.getSource() == jCheckBox_17)
{
if (jCheckBox_17.isSelected() == true)
{
Calendar c = Calendar.getInstance();
int hour= c.get(Calendar.HOUR_OF_DAY);
if (hour == 6 || hour == 7) {
jTextArea.append("获得一元优惠券" + "\n");
sub -= 1;
select[i] = 17;
}
else {
jTextArea.append("对不起,现在不是早餐时间" + "\n");
}
}
}else if (e.getSource() == jCheckBox_18)
{
if (jCheckBox_18.isSelected() == true)
{
Calendar c = Calendar.getInstance();
int hour= c.get(Calendar.HOUR_OF_DAY);
if (hour == 12 || hour == 13) {
jTextArea.append("获得三元优惠券" + "\n");
sub -= 3;
select[i] = 18;
}
else {
jTextArea.append("对不起,现在不是午餐时间" + "\n");
}
}
} else
{
return;
}
}
public int[] Select()
{
// for(int m = 0; m<select.length;m++)
// System.out.println(select[m]);
return select;
}
}
Oolong.java
package KFC;
public class Oolong implements Drinks
{
public void Use()
{
System.out.println("乌龙茶制作中...");
}
}
OverRice.java
package KFC;
public class OverRice implements StapleFood
{
public void Use()
{
System.out.println("盖饭制作中...");
}
}
receipt.java
package KFC;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
public class receipt
{
private static String filenameTemp = "D:/receipt.txt";
/**
* 创建文件
*
* @throws IOException
*/
public static boolean creatTextFile() throws IOException
{
File filename = new File(filenameTemp);
if (!filename.exists())
{
filename.createNewFile();
}
return true;
}
/**
* 写文件
*
* @throws IOException
*
*/
public static boolean writeTxtFile(String newStr) throws IOException
{
// 先读取原有文件内容,然后进行写入操作
boolean flag = false;
String filein = newStr + "\r\n";
String temp = "";
FileInputStream fis = null;
InputStreamReader isr = null;
BufferedReader br = null;
FileOutputStream fos = null;
PrintWriter pw = null;
try
{
// 文件路径
File file = new File(filenameTemp);
// 将文件读入输入流
fis = new FileInputStream(file);
isr = new InputStreamReader(fis);
br = new BufferedReader(isr);
StringBuffer buf = new StringBuffer();
// 保存该文件原有的内容
for (int j = 1; (temp = br.readLine()) != null; j++)
{
buf = buf.append(temp);
// System.getProperty("line.separator")
// 行与行之间的分隔符 相当于“\n”
buf = buf.append(System.getProperty("line.separator"));
}
buf.append(filein);
fos = new FileOutputStream(file);
pw = new PrintWriter(fos);
pw.write(buf.toString().toCharArray());
pw.flush();
flag = true;
} catch (IOException e1)
{
// TODO 自动生成 catch 块
throw e1;
} finally
{
if (pw != null)
{
pw.close();
}
if (fos != null)
{
fos.close();
}
if (br != null)
{
br.close();
}
if (isr != null)
{
isr.close();
}
if (fis != null)
{
fis.close();
}
}
return flag;
}
}
SetMeal1Factory.java
package KFC;
public class SetMeal1Factory implements SetMealFactory
{
public StapleFood produceStapleFood()
{
return new OverRice();
}
public Drinks produceDrinks()
{
return new Coke();
}
public Snack produceSnack()
{
return new Fries();
}
}
SetMeal2Factory.java
package KFC;
public class SetMeal2Factory implements SetMealFactory
{
public StapleFood produceStapleFood()
{
return new Hamburg();
}
public Drinks produceDrinks()
{
return new Juice();
}
public Snack produceSnack()
{
return new ChickenNeggets();
}
}
SetMeal3Factory.java
package KFC;
public class SetMeal3Factory implements SetMealFactory
{
public StapleFood produceStapleFood()
{
return new Hamburg();
}
public Drinks produceDrinks()
{
return new Juice();
}
public Snack produceSnack()
{
return new ChickenWings();
}
}
SetMealFactory.java
package KFC;
public interface SetMealFactory
{
public StapleFood produceStapleFood();
public Drinks produceDrinks();
public Snack produceSnack();
}
Snack.java
package KFC;
public interface Snack
{
public void Use();
}
SnackFactory.java
package KFC;
import java.util.Scanner;
public class SnackFactory
{
public static Snack Use(int select)
{
if (select == 7)
{
System.out.println("一份薯条!");
return new Fries();
} else if (select == 8)
{
System.out.println("一份鸡米花!");
return new ChickenNeggets();
} else if (select == 9)
{
System.out.println("一份鸡翅!");
return new ChickenWings();
}
return null;
}
}
StapleFood.java
package KFC;
public interface StapleFood
{
public void Use();
}
StapleFoodFactory.java
package KFC;
import java.util.Scanner;
public class StapleFoodFactory
{
public static StapleFood Use(int select)
{
if (select == 1)
{
System.out.println("一份盖饭!");
return new OverRice();
} else if (select == 2)
{
System.out.println("一份汉堡!");
return new Hamburg();
} else if (select == 3)
{
System.out.println("一份鸡肉卷!");
return new ChickenRolls();
}
return null;
}
}
四、调试及测试
- 在可视化界面点击后没有传给主类,只进行了构造,然后主类运行结束
于是必须让鼠标点击确定后才能让程序继续运行
添加代码块
System.out.println("按1确认");
Scanner s = new Scanner(System.in);
int sn = s.nextInt();
- 在可视化界面运行后,没有传给后台让制作,图如上,添加测试代码:
public int[] Select(){
for(int m = 0; m<select.length;m++)
System.out.println(select[m]);
return select;
}
发现数组中只有第一个有数,也就是说,他们全部存进第一个,没有下一个
进行调试,发现i一直不变,因为函数在鼠标每点击一遍,就调用一边
于是将i设为成员变量,并且设为静态变量
五、结果
如果运行两次,则txt文档如图
六、总结
在此次作业中,第一次尝试用可视化界面,在查阅资料之后对可视化界面有了一定得了解,在写可视化界面时遇到了很多比如由于函数自主调用而没办法让他按照规定顺序运行,在编写写文档代码时,只能保存第一个,第二次运行后文档不变的问题,但是在不断地查询资料中都一个一个解决了,这使我在可视化界面以及读写文档方面得到进步。在此次作业中,也是我更加熟练的使用各种设计模式。