KFC点餐收银系统
一.实验内容
同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能:
1.正常餐品结算和找零。
2.基本套餐结算和找零。
3.使用优惠劵购买餐品结算和找零。
4.可在一定时间段参与店内活动(自行设计或参考官网信息)。
5.模拟打印小票的功能(写到文件中)。
二.题目分析及类图设计
策略模式
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。针对同一类型问题的多种处理方式,仅仅是具体行为有差别时;需要安全地封装多种同一类型的操作时; 出现同一抽象类有多个子类,而又需要使用 if-else 或者 switch-case 来选择具体子类时。
抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
具体策略角色:包装了相关的算法和行为。
环境角色:持有一个策略类的引用,最终给客户端调用。
优点:策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码;提供了可以替换继承关系的办法。继承可以处理多种算法或行为;避免使用多重条件转移语句。缺点:客户端必须知道所有的策略类,并自行决定使用哪一个策略类;策略模式造成很多的策略类,每个具体策略类都会产生一个新类。
问题分析
首先建立一个抽象食物类AbstractFood,里面包含每种食物最基本的价格、数量等,还包含实现Huodong接口的打折函数YPrice();抽象角色为接口Food,可打印相关食物具体信息;抽象具体角色分别为Hamburg、Drink、OtherFood实现Food接口;建立接口KFCFactory为抽象工厂,实现抽象工厂的具体接口为Kfactory,返回到具体食物类。套餐分别建立抽象角色Drinkk、Other、Ham,在Customer类中实例化抽象工厂和抽象角色,选取不同具体角色组成套餐。不同方式结算时采用策略模式,Huodong为抽象策略类含YPrice()函数,Activity和Jianjia为具体策略类分别为不同减价模式;HighPrice为环境角色,含有成员变量,在Customer类中调用。
类图设计
自主点餐
策略模式:付款方式类图设计
三.运行截图
自主点餐
选择套餐
四.总结
将几种设计模式结合有一定的难度,代码主要参考于https://blog.csdn.net/baidu_38634843/article/details/83419802。主要难度在于实现不同付款方式的策略模式与其他模式的结合和Customer类的编写,要在全局的视野下新建类、进行继承、实现接口等。代码也不是很完善如:无法进行连续的点餐。
五.部分代码
付款方式
抽象食物:AbstractFood同时实现接口Huodong
public abstract class AbstractFood implements Huodong{
public double price;
public int num;
public String kind;
public double Price() {
return this.price*this.num;
}
public double YPrice(double foodPrice) {
return this.price*this.num;
}
}
接口:Food,打印输出不同食品信息
public interface Food {
public void printMessage();
}
套餐汉堡、饮品、其他食物抽象基类
public abstract class Hamburg extends AbstractFood implements Food{
public void printMessage() {
System.out.println(this.kind+"汉堡:\n"+"单价:"+this.price+"\n"+"数量:"+this.num+"\n");
}
}
单品汉堡、饮品、其他食物类
public class Drinkk extends AbstractFood implements Food{
public void printMessage() {
System.out.println(this.kind+"饮品:\n"+"单价:"+this.price+"\n"+"数量:"+this.num+"\n"+"合计 : "+Price());
}
public void Cola(int num) {
this.kind="百事可乐";
this.price=8.0;
this.num=num;}
public void Coffee(int num) {
this.kind="手磨咖啡";
this.price=15.0;
this.num=num;}
}
具体食物角色:OneHamburg、TwoHamburg、Coffee、Cola、Ice、Chickenwings
public class Chickenwings extends Otherfood{
public Chickenwings(int num) {
this.kind = "奥尔良烤翅";
this.price =18.0;
this.num = num;}
}
抽象工厂:KFCFactory
public interface KFCFactory {
//生产汉堡
public OneHamburg creatOneHamburg(int num);
public TwoHamburg creatTwoHamburg(int num);
//生产饮料
public Coffee creatCoffee(int num);
public Cola creatCola(int num);
//生产其他食物
public Chickenwings creatChickenwings(int num);
public Ice creatIce(int num);
}
具体工厂:Kfactory
public class Kfactory implements KFCFactory{
public OneHamburg creatOneHamburg(int num) {
return new OneHamburg(num);
}
public TwoHamburg creatTwoHamburg(int num){
return new TwoHamburg(num);
}
public Coffee creatCoffee(int num){
return new Coffee(num);
}
public Cola creatCola(int num){
return new Cola(num);
}
public Chickenwings creatChickenwings(int num){
return new Chickenwings(num);
}
public Ice creatIce(int num) {
return new Ice(num);
}
}
策略模式
接口:Huodong
public abstract interface Huodong {
public abstract double YPrice(double foodPrice);
}
实现类:
类Activity:实现将食物价格打九折
类Jianjia:实现将食物价格减五元
类HighPrice
public class HighPrice {
private Huodong huo;
private Huodong huo1;
public HighPrice(Huodong huo) {
this.huo=huo;
this.huo1=huo1;
}
public double quote(double foodPrice) {
return this.huo.YPrice(foodPrice);
}
}