问题描述
参考肯德基官网的信息模拟肯德基快餐店的收银系统,结合设计模式(2种以上)至少实现系统的以下功能:
1.正常餐品结算和找零。
2.基本套餐结算和找零。
3.使用优惠劵购买餐品结算和找零。
4.可在一定时间段参与店内活动(自行设计或参考官网信息)。
5.模拟打印小票的功能(写到文件中)。
问题分析
要产生不同的食物类,不难想到要用到抽象工厂模式,即定义抽象工厂类,具体工厂类生产对应的具体产品。
要根据不同的结账方式实现餐品结算,就可以用到策略模式,即用每一个结账类封装不同的结账方式。
UML类图
工厂模式
策略模式
方法说明
本系统的层级结构如下:
本系统的菜单层级关系如下:
以下就每个方法进行具体说明。
(食物基本信息类baseFood)
因为要在主菜单打印食物信息,所以需要一个食物信息类和打印食物信息的基类。
public class baseFood {
// 类别
protected String kind;
// 数量
protected int num;
// 价格
protected float price;
// 合计
public float totalPrice()
{
return this.num * this.price;
}
}
(打印食物信息接口)
public interface IFood {
String printMessage();
}
(抽象肯德基工厂接口类)
抽象工厂类,定义了如下抽象方法。
createHamburg()制作汉堡包;
createIceCream()制作冰激凌;
createBeverage()制作饮料;
createChicken()制作炸鸡;
其中的参数kind传入食品的代号,num传入食品的数量。
public interface KFCFactoryImpl {
public Hamburg createHamburg(int kind,int num);
public IceCream createIceCream(int kind, int num);
public Beverage createBeverage(int kind, int num);
public Chicken createChicken(int kind, int num);
}
(具体肯德基厨房类)
具体肯德基厨房实现抽象接口生产所需的食物。本程序实现了四个抽象产品:
汉堡包Hamburg
冰激凌IceCream
饮料Beverage
炸鸡 Chicken
//具体肯德基厨房工厂
public class KFCFoodFactory implements KFCFactoryImpl {
@Override
//制作汉堡包
public Hamburg createHamburg(int kind, int num) {
if(1 == kind){
return new BigMacHam(num);//巨无霸
}else if(2 == kind){
return new SpicyChickenHam(num);//香辣鸡腿堡
}else if(3 == kind){
return new OrleansChickenHam(num);//奥尔良鸡腿堡
}else{
return null;
}
}
//制作冰激凌
@Override