同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能:
1.正常餐品结算和找零。
2.基本套餐结算和找零。
3.使用优惠劵购买餐品结算和找零。
4.可在一定时间段参与店内活动(自行设计或参考官网信息)。
5.模拟打印小票的功能(写到文件中)。
基本要求:
1.程序设计风格良好,控制台界面友好,最多两人一组完成任务。
2.实现功能测试代码,确保程序的健壮性。
3.画出使用的设计模式图。
提高要求:
1.实现可视化界面(使用MFC)。
2.实现会员储值卡功能,完成储值卡消费。
3.实现当天营业额和餐品销量计算和统计,用数据库记录。
一、算法设计
主要运用了抽象工厂模式和单例模式的方法,剩下的都是Java的GUI图形用户处理
二、主要部分代码
抽象工厂类
public interface IKFCFactory {
public Staples createStaple(String s);
public Packages createPackages(String s);
public Drinks createDrink(String s);
}
public class ChinaKfcFactory implements IKFCFactory{
public Staples createStaple(String s) {
if(s.equals(new Staple1().kind)) {
return new Staple1();
}else if(s.equals(new Staple2().kind)) {
return new Staple2();
}else if(s.equals(new Staple3().kind)) {
return new Staple3();
}
return null;
}
public Packages createPackages(String s) {
if(s.equals(new Package1().kind)) {
return new Package1();
}else if(s.equals(new Package2().kind)) {
return new Package2();
}else if(s.equals(new Package3().kind)) {
return new Package3();
}
return null;
}
public Drinks createDrink(String s) {
if(s.equals(new Drink1().kind)) {
return new Drink1();
}else if(s.equals(new Drink2().kind)) {
return new Drink2();
}else if(s.equals(new Drink3().kind)) {
return new Drink3();
}
return null;
}
}
抽象食物类
public abstract class AbstractFood {
// 类别
public String kind;
// 价格
public float price;
}
public class Staples extends AbstractFood{
public Staples() {
}
}
public interface StapleList{
public static String []kinds=new String[]{"香辣鸡腿堡","劲脆鸡腿堡","新奥尔良烤鸡腿堡"};
public static float []prices={14.5f,14.5f,15f};
}
具体食物类
public class Staple1 extends Staples implements StapleList{
public Staple1() {
this.kind=kinds[0];
this.price=prices[0];
}
}
主要界面
import java.awt.*;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;
import menu.*;
public class CreatePanel{
JButton button1,button2,sure,cancel,select;
JMenuBar menuBar;
JMenu menu1,menu2,menu3;
JButton []btuIcon= new JButton[3];
static Object a[][]=new Object[10][4];
static Object th[]={"商品名称","单价","数量","价格"};
JTable table=new JTable(new DefaultTableModel(a,th));
JPanel panel1,panel2,panel3,panel4;
JLabel account,password,lastmoney,rechange;
JTextField accountf,lastmoneyf,rechangef;
JPasswordField passwordf;
public CreatePanel(){
panel1=new JPanel();
panel1.setBorder(new TitledBorder(""));
panel2 =new JPanel();
panel3=new JPanel();
panel3.setBorder(new TitledBorder(""));
panel4=new JPanel();
panel4.setBorder(new TitledBorder("充值"));
//结算
table.setFont(new Font("Dialog", 1, 16));
table.setRowHeight(40);
button1=new JButton("结账");
button1.setSize(10,60);
button2=new JButton("删除");
button2.setBounds(300,10,100,50);
//菜单
menuBar=new JMenuBar();
menu1=new JMenu("主食");
menu1.setSelected(true);
menu2=new JMenu("套餐");
menu3=new JMenu("饮料和甜点");
for(int i=0;i<3;i++) {
btuIcon[i]=new JButton(StapleList.kinds[i]);
}
//充值
account=new JLabel("账号:");
account.setFont(new Font("Dialog", 1, 16));
account.setBounds(50,20,50,50);
accountf=new JTextField();
accountf.setBounds(120,30,200,35);
password=new JLabel("密码:");
password.setFont(new Font("Dialog", 1, 16));
password.setBounds(50,70,50,50);
passwordf =new JPasswordField();
passwordf.setBounds(120,80,200,35);
lastmoney=new JLabel("余额");
lastmoney.setFont(new Font("Dialog", 1, 16));
lastmoney.setBounds(50,120,50,50);
lastmoneyf=new JTextField("0.0");
lastmoneyf.setBounds(120,130,100,35);
rechange= new JLabel("充值:");
rechange.setFont(new Font("Dialog", 1, 16));
rechange.setBounds(50,170,50,50);
rechangef=new JTextField("0.0");
rechangef.setBounds(120,180,100,35);
sure=new JButton("充值");
sure.setBounds(40,235,100,40);
cancel=new JButton("退出充值");
cancel.setBounds(200,235,100,40);
select=new JButton("查询余额");
select.setBounds(250,120,100,40);
}
public JPanel left() {
JPanel panel=new JPanel();
panel.setBorder(new TitledBorder("结账"));
panel.setLayout(new GridLayout(2,1));
panel.add(new JScrollPane(table));
panel.add(panel1);
button1.addActionListener(new SettleCountsListener(table));
button2.addActionListener(new deleteSelectListener(table));
panel1.add(button1);
panel1.add(button2);
return panel;
}
public JPanel right() {
JPanel panel=new JPanel();
panel.setLayout(new BorderLayout());
menuBar.add(menu1);
menuBar.add(menu2);
menuBar.add(menu3);
menu1.addMenuListener(new MenusListener(this,1));
menu2.addMenuListener(new MenusListener(this,2));
menu3.addMenuListener(new MenusListener(this,3));
panel.add(menuBar,BorderLayout.NORTH);
panel.add(panel2,BorderLayout.CENTER);
panel2.setLayout(new BorderLayout());
panel3.setPreferredSize(new Dimension(0,250));
panel2.add(panel3,BorderLayout.NORTH);
panel2.add(panel4,BorderLayout.CENTER);
//选择按钮
panel3.setLayout(new GridLayout(1,3));
for(int i=0;i<3;i++) {
TaocanListener c=new TaocanListener(this);
btuIcon[i].addActionListener(c);
panel3.add(btuIcon[i]);
}
//充值
panel4.setLayout(null);
panel4.add(account);
panel4.add(accountf);
panel4.add(password);
panel4.add(passwordf);
panel4.add(lastmoney);
panel4.add(lastmoneyf);
panel4.add(rechange);
panel4.add(rechangef);
panel4.add(sure);
panel4.add(cancel);
panel4.add(select);
select.addActionListener(new RechangeListener(this,1));
sure.addActionListener(new RechangeListener(this,2));
cancel.addActionListener(new RechangeListener(this,3));
return panel;
}
}
四、运行图[
五、总结
这次的作业说实在有些难,虽然在设计模式上做的比较简单,但做界面上也遇到了各种难题,只是各种组件的之间的响应就花了很长时间,这也让我在GUI方面有了更多的了解,虽然不算熟练,也很熟悉如何能做出来。