题目:
同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能:
1.正常餐品结算和找零。
2.基本套餐结算和找零。
3.使用优惠劵购买餐品结算和找零。
4.可在一定时间段参与店内活动(自行设计或参考官网信息)。
5.模拟打印小票的功能(写到文件中)。
基本要求:
1.程序设计风格良好,控制台界面友好,最多两人一组完成任务。
2.实现功能测试代码,确保程序的健壮性。
3.画出使用的设计模式图。
提高要求:
1.实现可视化界面(使用MFC)。
2.实现会员储值卡功能,完成储值卡消费。
3.实现当天营业额和餐品销量计算和统计,用数据库记录。
算法设计思路:
使用抽象工厂模式实现套餐、使用简单工厂实现自定义点餐、使用策略模式实现优惠券的获取;将模式可交互的地方完整的交叠在一起。
具体实现:
将不同的餐点放入不同放入class中,这些类分别实现不同的接口,包括主食、饮料以及小吃三个接口,还有一个不同的接口用来将三个接口串起来实现整个的套餐,在调用套餐时,仅仅使用综合接口的具体实现类,而在自点餐时,可调用其余三个接口的具体实现类;
将不同的优惠券放入不同的class类中,用于实现一个接口内的抽象函数,最终另一个类内,调用此函数,并建立接口实现对象,除了接口函数的实现外,还包括自行建立的一个函数;
主函数主要是菜单功能,用于调用不同的接口实现类,将整个程序串在一起,整体实现运行模式。
UML类图:
1.策略模式实现优惠券功能:
2.抽象模式实现套餐功能:
源程序:
package ken;
public class Array {
private code codeObj;
public int extract(int num) {
return codeObj.extract(num);
}
public void sextract(code codeObj) {
this.codeObj=codeObj;
}
}
package ken;
public class choose {
public static order getorder(String brand) {
order order1=null;
if(brand.equalsIgnoreCase("1")) {
return new combo1();
}
else if(brand.equalsIgnoreCase("2")) {
return new combo2();
}
else if(brand.equalsIgnoreCase("3")) {
return new combo3();
}
return order1;
}
}
package ken;
public interface code {
public abstract int extract(int a);
}
package ken;
public class code1 implements code{
public int extract(int a) {
System.out.println("5元优惠券");
return a-5;
}
}
package ken;
public class code2 implements code{
public int extract(int a) {
System.out.println("10元优惠券");
return a-10;
}
}
package ken;
public class code3 implements code{
public int extract(int a) {
System.out.println("20元优惠券");
return a-20;
}
}
package ken;
public class coke implements drink{
public void making() {
System.out.println("4.可乐 ¥6.00");
}
}
package ken;
public class combo1 implements order{
public drink producedrink(){
return new milk();
}
public food producefood() {
return new Hamburg();
}
public snacks producesnacks() {
return new corn();
}
}
package ken;
public class combo3 implements order{
public drink producedrink(){
return new milk();
}
public food producefood() {
return new taco();
}
public snacks producesnacks() {
return new tart();
}
}
package ken;
public interface drink {
public void making();
}
package ken;
public interface food {
public void choose();
}
package ken;
public class Hamburg implements food{
public void choose() {
System.out.println("1.汉堡 ¥19.00");
}
}
package ken;
public class milk implements drink{
public void making() {
System.out.println("2.牛奶 ¥8.00");
}
}
package ken;
public interface order {
public drink producedrink();
public food producefood();
public snacks producesnacks();
}
package ken;
import javax.swing.*;
import java.awt.*;
public class view {
public void view(){
JFrame f=new JFrame("KFC点餐系统");
f.setSize(500,600);
f.setLocation(580,200);
f.setLayout(null);
JButton b=new JButton("合计");
b.setBounds(350,500,100,30);
f.add(b);
JButton b1=new JButton("自点餐");
JButton b2=new JButton("套餐");
JButton b3=new JButton("优惠券");
b1.setBounds(10,10,100,30);
f.add(b1);
b2.setBounds(10,50,100,30);
f.add(b2);
b3.setBounds(10,90,100,30);
f.add(b3);
JCheckBox bCheckBox=new JCheckBox("汉堡");
bCheckBox.setSelected(true);
bCheckBox.setBounds(150,10,80,60);
JCheckBox bCheckBox1=new JCheckBox("玉米");
bCheckBox1.setBounds(250,10,80,60);
JCheckBox bCheckBox2=new JCheckBox("塔可");
bCheckBox2.setBounds(350,10,80,60);
JCheckBox bCheckBox3=new JCheckBox("可乐");
bCheckBox3.setBounds(150,80,80,50);
JCheckBox bCheckBox4=new JCheckBox("牛奶");
bCheckBox4.setBounds(250,80,80,50);
JCheckBox bCheckBox5=new JCheckBox("蛋挞");
bCheckBox5.setBounds(350,80,80,50);
System.out.println(bCheckBox1.isSelected());
System.out.println(bCheckBox2.isSelected());
System.out.println(bCheckBox3.isSelected());
System.out.println(bCheckBox4.isSelected());
System.out.println(bCheckBox4.isSelected());
f.add(bCheckBox);
f.add(bCheckBox1);
f.add(bCheckBox2);
f.add(bCheckBox3);
f.add(bCheckBox4);
f.add(bCheckBox5);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
int option=JOptionPane.showConfirmDialog(f, "KFC点餐小票打印");
}
}
package ken;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class Write{
public void write(String s,int num){
try {
String content="This is the content to write into file";
File file =new File("C://Program Files/Java/eclipse-java-2018-12-R-win32-x86_64/eclipse/ken/test.txt");
if(!file.exists()){
file.createNewFile();
}
FileWriter fw =new FileWriter(file.getAbsoluteFile());
BufferedWriter bw =new BufferedWriter(fw);
bw.write("KFC点餐小票");
bw.write("-----------");
bw.write(s);
bw.write("合计金额:"+num);
bw.close();
System.out.println("Done");
}
catch (IOException e ){
e.printStackTrace();
}
}
}
程序运行结果截图:
1.自点餐的实现:(由于最低钱数有限制,无优惠券)
2.套餐(包括优惠券等):
3.提高要求的实现界面:
总结:
本次程序在做的过程中融汇了两种设计模式,两种设计模式所要承担的任务不同,所以实现效果也不同;
开始时,在融合套餐和单点餐时,我将整体的区分开来,而实际上,我们可以直接使用抽象模式中的一部分,调用所要使用的接口,将整个程序串起来,这样就简化了整个程序的代码量;
在制作提高要求部分时,我将界面实现之后仅仅只能实现将界面展示出来,以及将整体的最基础部分实现,所以整个的界面框已经实现,但由于本次本身的知识不足,所以实现的功能并不全面;
在实现的过程中,开始时,不太清楚整个程序系统的实现顺序,以及在实现过程中所需要链接的东西,所以在后期整体需要串连起来的时候改动量较大,也在看的过程中不能清晰明了的将整体或缺的部分清楚的指出来;
套餐的实现过程,显示界面由于出现的一定的差别,在点餐的时候,并没有出现相应的效果,最终加上了进一步的输入值,将整体的程序运行,以及在程序写入文件的过程起到了作用,在调用类的过程中,我们第一次输入的数值是为了调用抽象函数中的套餐分组,而第二次输入,主要在于实现文件的写入,将套餐和优惠券也联系起来,在钱数到达一定值的时候会自动生成一个优惠券,给顾客优惠,也体现了整个的人性化,但同时如果在点餐后并没有领取优惠券,也不会实现相应的功能。