Java大作业————面向对象设计(购物车)

团队介绍

成员姓名 负责任务
杨涛 编码规范、GUI设计及代码编写
吴执涛 DAO接口及文件读写方法编写
蔡锦涛 前期调查与功能设计、货物操作类、博客制作

Git地址

Gitee仓库

前期调查



用户首先通过输入账号密码登录账号,随后在商场中浏览商品,并将心仪的商品添加到购物车中,在购物车中可以将商品的数量增加或减少,且可以删除商品。

由以上可知,购物车应大概拥有这些功能:
1.设计一个小商城,为了更加灵活,我们将商城设置成自由添加商品。
2.购物车可以随意添加或删除商品,增加或减少商品数量
3.可以清空或结算购物车

程序运行效果

登录注册:

商品栏添加商品:

商品栏删除商品:

在购物车中添加商品:

删除购物车中的商品:

在购物车中增加商品数量:

在购物车中减少商品数量:

清空购物车:

结算购物车:

系统功能结构图

系统描述

点击运行购物车软件,输入账号密码,或者直接注册一个账号。登录成功后进入主界面,主界面包含商城和购物车两个模块。在商城中,可以自行填入商品名称单价并把商品添加进商城,也可以从商城中删除商品,遇到心仪的商品可以加入购物车。在购物车中,可以修改商品数量,也可以直接删除商品,或者清空购物车将商品全都删除,最后可以结算购物车,计算总价格

UML类图

MVC模式

MVC模式简述

MVC模式中,M指Model(业务模型),V指View(视图),C指Controller(控制器),其中Controller也就是事件监听器。就让我们拿
MVC模式的好处:
1.代码耦合度低。每个模块各司其职,M、V、C分别负责不同的功能,对界面的操作代码和业务逻辑代码之间分离。
2.可以做到分层开发。编写业务逻辑代码的程序员不用考虑界面操作,编写控制器的只需要处理与view交互的数据,并选择合适的业务逻辑代码处理数据即可。
3.扩展性和可维护性高。由于各功能模块之间代码分离,修改某部分代码时只要处理好接口,就不会影响到其他代码。

MVC模式在程序中的体现

就让我们拿在 商品栏添加商品 来举例。

MVC分为Model, View, Controller。其中Controller即为监听器,即上图中的addActionPerformed,当用户输入完商品名称和单价,并点击添加按钮,就会触发Controller,Controller就会从nameTextpriceText获取信息,即从视图层获取信息,创建DefaultTableModel对象存放goods模型,然后将获取到的信息添加到模型里,并更新视图,同时存放到本地文档里。

DAO模式

DAO模式,是将业务逻辑与数据的具体访问相分离的一种模式,它可以根据后台数据存储方式的不同,定义不同的实现方法。例如,编写GUI相关代码时,无需考虑数据操作的具体实现方法,只需要调用相应DAO方法。如果底层数据存储方式需要改变,只要增加DAO接口的新实现类即可,有利于不同人员的分工合作,提高效率。

项目包结构和关键代码

包结构

将对界面操作的代码和业务逻辑代码相分离,分成两个包,分别为gui和shopping

关键代码

把商品添加到购物车中:

 public int putIn(Product p) {
        Entry e = new Entry(p);
        int flag = 0;
        int index = -1;
        if (this.list.size() == 0) {
            this.list.add(e);
        } else {
            for (int i = 0; i < this.list.size(); i++) {
                Entry x = this.list.get(i);
                if (p.equals(x.getP())) {
                    x.setCount(x.getCount() + 1);
                    x.setTotalPrice(x.getTotalPrice() + p.getPrice());
                    this.list.set(i, x);
                    index = i;
                    flag = 1;
                }
            }
            if (flag == 0) {
                this.list.add(e);
            }
        }
        return index;
    }

在商品栏中删除商品:

 private void deleteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteActionPerformed
        // TODO add your handling code here:
        DefaultTableModel model = (DefaultTableModel) goods.getModel();
        int[] selectRows = goods.getSelectedRows();
        for (int i = selectRows.length - 1; i >= 0; i--) {
            int selectRow = selectRows[i];
            if (selectRow != -1) {
                model.removeRow(selectRow);
            }
        }
        String[] name=new String[goods.getRowCount()];
        Double[] price=new Double[goods.getRowCount()];
        TableModel model1 = goods.getModel();
        for (int i = 0; i <goods.getRowCount() ; i++) {
            name[i]=(String)model1.getValueAt(i,0);
            price[i]=(Double)model1.getValueAt(i,1);
        }
        try {
            deleteGoods(name,price);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

读取本地文件到商品栏:

private boolean readGoods() throws FileNotFoundException, IOException {
        DefaultTableModel model = (DefaultTableModel) goods.getModel();

        String pathName = ".\goods.txt";
        if (System.getProperty("os.name").equals("Mac OS X")) {
            pathName = "./goods.txt";
        }
        File f = new File(pathName);
        if (!f.exists()) {
            try {
                f.createNewFile();
            } catch (IOException e) {
                // TODO: handle exception
                e.printStackTrace();
            }
        }
        try (FileReader reader = new FileReader(pathName);
                BufferedReader br = new BufferedReader(reader) ){

            String line1, line2;
            while ((line1 = br.readLine()) != null) {
                if(line1.equals(""))
                    break;
                line2 = br.readLine();
                String name = line1;
                Double price = Double.parseDouble(line2);
                Object[] o = {name, price};
                model.addRow(o);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return true;
    }
原文地址:https://www.cnblogs.com/cjt0722/p/13977592.html