模拟KFC点餐系统

一, 题目要求

模拟KFC点餐系统。

1.正常餐品结算和找零。
2.基本套餐结算和找零。
3.使用优惠劵购买餐品结算和找零。
4.可在一定时间段参与店内活动(自行设计或参考官网信息)。
5.模拟打印小票的功能(写到文件中)。

基本要求:

1.程序设计风格良好,控制台界面友好,最多两人一组完成任务。
2.实现功能测试代码,确保程序的健壮性。
3.画出使用的设计模式图。

提高要求:

1.实现可视化界面(使用MFC)。
2.实现会员储值卡功能,完成储值卡消费。
3.实现当天营业额和餐品销量计算和统计,用数据库记录。

二, 题目分析

第一部分(基本要求):

业务流程图:
在这里插入图片描述
类的结构:
在这里插入图片描述
每个食物应当有的属性:食物名字,价格,以及点餐数量,故设计一个抽象食物类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数据库,实现保存存蓄卡信息,可查询储蓄卡信息、添加新的储蓄卡、使用储蓄卡消费以及向卡中充值功能。在数据库中记录当天销售的食品数量和产品销售额。(未实现)
三, 类图设计
在这里插入图片描述
四,主要代码:
MAIN类:

public class MAIN {
	
	public static void main(String[] args)
	  {
		//实例化Client
		Client customer=new Client();
		//实例化策略类
		StrategyContext strategyA=new StrategyContext();
		StrategyContext strategyB=new StrategyContext();
		strategyA.setStrategy(new StrategyItem());
		strategyB.setStrategy(new StrategyCombo());
		
		//抽象工厂
		AbstractKFCFactory kfcFactory = new KFCFactory();
		ComboFactoryA comA=new HD();//A套餐的抽象
		ComboFactoryB comB=new FD();//B套餐的抽象
		//传入参数
		customer.setAbstractKFCFactory(kfcFactory);
		customer.setComboFactoryA(comA);
		customer.setComboFactoryB(comB);
		
		//显示选择界面
	    customer.Maininterface();
		
	    //键盘输入,进行用户选择
		Scanner in = new Scanner(System.in);
		int choose=in.nextInt();
		if(choose==1)
			strategyA.algorithm(customer);	
		else 
			strategyB.algorithm(customer);
		//键盘输入关闭
	    in.close();
	  }
}

生成单品的抽象工厂:

package teamwork.KFC;

public class KFCFactory implements AbstractKFCFactory {
	  // 生产可乐
	  public ChinaDrink createBeverage(int num)
	  {
	    return new ChinaDrink(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 Chickenleg(num);
	  }
}

生产套餐A的抽象工厂


public interface ComboFactoryA {
	public Hamburg createHamburg();//汉堡
	public Drink createDrink();//饮料
}

五, 调试、测试及运行结果
测试:

运行结果:
第一部分:
初始化:
在这里插入图片描述
选择单品:
在这里插入图片描述
保存在文件中:
在这里插入图片描述
选择套餐:
选择套餐:
在这里插入图片描述
保存在文件中
在这里插入图片描述
第二部分;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
测试:
1.使用JUint 5单元测试对代码进行测试,免去了在main方法中创建对象,使用对象调用方法的复杂过程。在创建方法完成后即可进行测试。
1.1在项目中添加JUint 5,在方法上方显式注明@Test
1.2 双击方法名,在Run As 中使用Junit 进行测试。

六, 经验归纳
本次作业通过小组形式完成,在小组中可以更好地解决出现的问题,减少知识盲区,但是在本次作业中并未将两部分内容进行联系,第一部分采用了设计模式,而第二部分没用采用设计模式仅实现了部分功能,因而不能实现功能对接。主要原因是小组成员缺乏可视化界面编程的经验。对可视化程序的结构设计不明确。第一部分部分功能存在缺陷,但是设计模式体现明确,通过本次作业,小组成员对设计模式有了更深刻的理解,同时都对可视化界面有了初步的认识,能够运用可视化解决一些问题。也提高了团队的协作能力,在交流中解决了编程中出现的一些错误,学习到了更多编程思想。
个人总结:
做完此次程序设计,我最大的感想是,好的设计方案,可以让编写程序起到事半而功倍的效果。因此,一开始,就应该将工作的重心放在设计方案上。当然,好的设计方案,不会一蹴而就,只能是不断设计,不断编程,不断优化设计方案。本次KFC设计中,开始时设计方案为A类食物接口和B类食物接口,通过具体产品类实现接口,再建立抽象工厂生产套餐,但是食物本质上是一个实体型,这样设计不合理,通过小组讨论,将A类食物接口和B类食物接口改为食物抽象类,再通过继承得到四个种类的食物抽象类,每种食物抽象类只负责单一种类食物的生成。将它再和抽象工厂结合生产套餐,单品则利用工厂方法模式,来设计一个工厂。这样子开始以后发现选择嵌套在一起看着不大好,就选择了策略模式对其进行优化。设计模式使得这个程序思路非常清晰,但是产生了非常多的类,这样的结果就是,定义在一些类中的方法,极其容易记错。这就要说起类名,类名应当具有极强的辨识度和记忆性。功能相似的类我觉得可以放在一个包下,这样使得类结构会更加清晰。本次小组合作作业中,我的任务主要是对设计模式这块的编程,我对种类繁多的类放在一个包中的弊端,有着极其深刻的认识。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值