KFC点餐系统
一、题目要求
1.同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能:
2.正常餐品结算和找零。
3.基本套餐结算和找零。
4.使用优惠劵购买餐品结算和找零。
5.可在一定时间段参与店内活动(自行设计或参考官网信息)。
6.模拟打印小票的功能(写到文件中)。
基本要求:
7.程序设计风格良好,控制台界面友好,最多两人一组完成任务。
8.实现功能测试代码,确保程序的健壮性。
9.画出使用的设计模式图。
提高要求:
10.实现可视化界面(使用MFC)。
11.实现会员储值卡功能,完成储值卡消费。
12.实现当天营业额和餐品销量计算和统计,用数据库记录。
二、题目分析及设计
1.题目分析
第一部分
业务流程图:
类的结构:
每个食物应当有的属性:食物名字,价格,以及点餐数量,故设计一个抽象食物类AbstractFood与之对应。点餐时,需要控制台输出点餐信息。如果写在抽象食物类中,继承后又得不断的重写。所以设计了Food接口,用于提供打印消息的接口。由此,基本食物的抽象建立已经完成。通过继承AbstractFood类和实现Food接口,得到四类基本食物的抽象类:(1)Chickenleg(2)Drink(3)Chickenwings(4)Frenchfries。通过实现此四种抽象食物,得到四种基本食物。有了食物单品后,就能够进行点餐的设计,点单品的操作通过工厂方法KFCFactory实现,即为工厂方法。套餐使用了产品族,可以设计为一个抽象工厂。程序设计的过程中只涉及了两个工厂:1.ComboFactoryA ,2.ComboFactoryB。通过具体的工厂HD和FD来完成具体套餐的实现。选择单品和套餐的设计由策略类完成。StrategyItem类里边的algorithm为选择单品的算法。StrategyCombo类里边的algorithm算法为选择套餐的算法。
第二部分(可视化界面)(注:本次采用java中的GUI编程):
(1)首先进入KFC官网了解产品的相关信息,并从官网获取(部分)食物的图片资料。
(2对收集的产品进行分类,本次共分为汉堡类、鸡翅类、甜品及饮料类和套餐类。
(3)进行可视化界面的框体设计,总体分为6个窗体以及若干个按钮组件,主界面包含四个食物品种的按钮,各个种类各有一个子窗体,包含改种类下的食物以及一个结算窗体。
(4)主窗体与结算窗体同时出现,通过按钮在主窗体与子窗体之间建立联系(点击相应的按钮,弹出相应的窗体),通过按钮在子窗体和结算窗体之间建立联系(选择相应的食物,在结算窗体中记录,就算关闭结算窗体,再选择其他种类的物品时,自动弹出结算窗体,并记录)。
(5)在结算窗体中进行结账、打折以及打印小票功能(未实现打印小票功能,具体原因在测试中说明)
(6)连接MYSQL数据库,实现保存存蓄卡信息,可查询储蓄卡信息、添加新的储蓄卡、使用储蓄卡消费以及向卡中充值功能。在数据库中记录当天销售的食品数量和产品销售额。(未实现)
三、UML类图设计
四、部分代码
给按钮添加监听器,检测是否按下
//给but1添加监听器
but1.addMouseListener(new MouseAdapter() {
//new MouseListener()必须实现接口中所有方法
//new MouseAdapter()可以仅实现按下方法
public void mouseClicked(MouseEvent e) {
\\按下后具执行体代码
}
});
给按钮添加图片
ImageIcon icon = new ImageIcon("C:\\Users\\新奥尔良烤鸡腿堡.jpg");
Image img = icon.getImage();
img = img.getScaledInstance(but.getHeight(), but.getWidth(), Image.SCALE_DEFAULT);
but.setIcon(icon);
f.add(but);
第一部分代码,见:https://blog.csdn.net/qq_44002167/article/details/90142723
五、调试和测试
1.使用JUint 5单元测试对代码进行测试,免去了在main方法中创建对象,使用对象调用方法的复杂过程。在创建方法完成后即可进行测试。
1.1在项目中添加JUint 5,在方法上方显式注明@Test
1.2 双击方法名,在Run As 中使用Junit 进行测试。
2.总体测试:
第一部分:
进入主界面,购买套餐并打折,如下:
购买相同套餐不打折:
购买多个单品,如下:
第二部分:
运行程序,主界面与结算窗体出现,如下:
进入汉堡界面,购买食物,具体清单显示在结账窗体,如下:
再进入其他界面购买任意商品:
单击结账之后对购买的物品数目进行总结,并计算总价钱,单机打折,显示折后价:
六、总结
1.小组总结:
本次作业通过小组形式完成,在小组中可以更好地解决出现的问题,减少知识盲区,但是在本次作业中并未将两部分内容进行联系,第一部分采用了设计模式,而第二部分没用采用设计模式仅实现了部分功能,因而不能实现功能对接。主要原因是小组成员缺乏可视化界面编程的经验。对可视化程序的结构设计不明确。
第一部分部分功能存在缺陷,但是设计模式体现明确,通过本次作业,小组成员对设计模式有了更深刻的理解,同时都对可视化界面有了初步的认识,能够运用可视化解决一些问题。也提高了团队的协作能力,在交流中解决了编程中出现的一些错误,学习到了更多编程思想。
2.个人总结:
在可视化界面的编写的过程中,因为是初次使用GUI编程,遇到了很多问题。首先就是在界面的选择中,我们经过讨论决定使用按钮组件,放弃弹出式菜单。因为弹出式菜单在选择食物的会增加操作,若需要了解食物详细信息,还得添加监听器等操作。
遇到的问题:图片大小和按钮组件不相符
解决方案:①让图片适应按钮的大小②按钮适应图片大小③将JButton组件更换为JPanel组件
最终采用①方法,让图片适应按钮的大小。从网站收集的图片像素大,若让按钮适应图片大小可视化界面太大。个人感觉JPanel组件的美观程度不如JButton组件。
遇到的问题:将结算后的信息从静态文本中获取出来,无法写入文件
具体原因:使用getText()方法获取的String类型的字符串是一个多行字符串,使用write()无法写入。
解决方案:经过百度等一系列操作,未能找到解决方案,因此将此项功能搁置。
在第一部分设计之前和队友对各种设计模式进行了了解,选择了3中来设计本次的程序,在设计中食物类进行了优化,使得能更好的体现设计模式
在本次作业中对设计模式的理解更加深刻,同时可以设计合理的模式去解决问题,自己也对GUI可视化中的各部分有了一定的了解,同时对其他的可视化也有了初步的认识。GUI设计出来的界面并不是十分的好,感觉自己需要学习的东西还有很多,比如了解更多的设计模式并用其来解决实际问题,学习javaWeb等开发出更加好的界面…