一. 部分功能运行结果展示:
1.商城内初始商品窗口显示
2.商品添加不允许重复
3.商品查询和删除功能
4.添加商品进购物车
5.计算商品总价,退出系统
二. 系统描述:
该系统是一个简单的购物车系统,用户可以选择添加商品、查看全部商品、查看指定编号的商品信息、删除商品、添加商品到购物车、显示购物车商品、删除购物车商品和计算购物车总价等操作。
名词: 商品,购物车;
动词:添加,查看,删除,计算,显示;
系统中存在以下对象:
- MainFrame:界面类,用于显示商品列表和与用户进行交互。
- ShoppingCenter:商店类,用于管理商品的增加、删除和查询。
- Commodity:商品类,包含商品的编号、名称和价格等属性。
- ShoppingCart:购物车类,用于管理购物车中的商品条目。
- ItemEntry:购物车条目类,包含商品和数量等属性。
系统的流程如下:
- 用户打开系统,界面显示商品列表。
- 用户可以选择添加商品、查看全部商品、查看指定编号的商品信息、删除商品、添加商品到购物车、显示购物车商品、删除购物车商品和计算购物车总价等操作。
- 添加商品:用户输入商品的编号、名称和价格,系统将商品添加到商店中。
- 查看全部商品:系统显示商店中所有的商品信息。
- 查看指定编号的商品信息:用户输入商品编号,系统根据编号查找商品信息并显示。
- 删除商品:用户输入商品编号,系统根据编号删除对应的商品。
- 添加商品到购物车:用户输入商品编号和数量,系统将商品添加到购物车中。
- 显示购物车商品:系统显示购物车中的所有商品信息。
- 删除购物车商品:用户输入商品删除对应商品使得数量减一
主要功能的流程图:
- 购物车添加商品的流程图:
开始 -> 显示商品列表 -> 选择商品 -> 添加到购物车 -> 显示购物车内容 -> 结束
- 关键代码:
- 购物车类
package shopping;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
public class ShoppingCart {
private static List<ItemEntry> itemList = new ArrayList<>();//
// 计算购物车内商品总价
public String calculate() {
BigDecimal sum = new BigDecimal("0");
for (ItemEntry itemEntry : itemList) {
BigDecimal priceCal = new BigDecimal(Double.toString(itemEntry.item.getPrice()));
BigDecimal qtyCal = new BigDecimal(itemEntry.qty.toString());
sum = sum.add(priceCal.multiply(qtyCal));
}
return sum.toString();
}
// 增加商品
public void add(Commodity e, int sum) {
if (e == null) {
return;
}
int index = findById(e.getId());
if (index == -1) {// 如果不包含该商品的条目
itemList.add(new ItemEntry(e, sum));
} else {
System.out.println("商品已经存在购物车,数量增加");
itemList.get(index).increase(sum);
}
}
// 减少商品数量
public boolean remove(Integer id) {
if (id == null)
return false;
int index = findById(id);
if (index == -1) { // 未找到
return false;
} else {
ItemEntry entry = itemList.get(index);
if (entry.getQty() <= 1) {// 当条目数量<1则删除条目
itemList.remove(index);
} else {
entry.decrease();
}
}
return true;
}
// 展示购物车内的商品
public void diplayAll() {
for (ItemEntry itemEntry : itemList) {
System.out.println(itemEntry);
}
}
// 通过id在购物车中查找是否已存在相关条目。 声明为private,因为只在本类中使用。 如果包含返回相关条目所在下标,否则返回-1
private int findById(Integer id) {
for (int i = 0; i < itemList.size(); i++) {
if (itemList.get(i).getItem().getId().equals(id))
return i;
}
return -1;
}
// 购物车条目类:代表购物车的某一个条目,包含商品与商品对应的数量。该类为内部类。
private class ItemEntry {
Commodity item;// 商品
Integer qty;// 数量
public ItemEntry(Commodity item, int sum) {
this.item = item;
qty = sum;
}
public void increase(int sum) {
qty += sum;
}
public void decrease() {
qty--;
}
public Commodity getItem() {
return item;
}
public Integer getQty() {
return qty;
}
@Override
public String toString() {
return "条目:" + item + ", 商品数量=" + qty;
}
}
}
- 商城类
package shopping;
import java.util.ArrayList;
import java.util.List;
public class ShoppingCenter {
private static List<Commodity> commodityList = new ArrayList<Commodity>();
// static 静态代码块,第一次加载的时候执行,只执行一次,静态变量进行初始化
static {
commodityList.add(new Commodity(1000, "手机", 2999.9));
commodityList.add(new Commodity(1001, "电脑", 12999.9));
commodityList.add(new Commodity(1002, "充电器", 9.9));
commodityList.add(new Commodity(1003, "牛奶", 59.9));
}
public void add(Commodity co) {
boolean flag = false;
for (int i = 0; i < commodityList.size(); i++) {
Commodity commodity = commodityList.get(i);
if (co.getId().equals(commodity.getId())) {
flag = true;
break;
}
}
if (flag) {
System.out.println("商品已经存在");
} else {
System.out.println("添加成功");
commodityList.add(co);
}
}
public void diplayAll() {
for (Commodity commodity : commodityList) {
System.out.println(commodity);
}
}
public List<Commodity> findAll() {
return commodityList;
}
public Commodity findId(int id) {
// 比较查找编号
for (int i = 0; i < commodityList.size(); i++) {
Commodity commodity = commodityList.get(i);
if (commodity.getId() == id) {
return commodity;
}
}
return null;
}
public void removeId(int id) {
boolean flag = false;
for (int i = 0; i < commodityList.size(); i++) {
Commodity commodity = commodityList.get(i);
if (commodity.getId() == id) {
commodityList.remove(commodity);
flag = true;
}
}
if (flag) {
System.out.println("删除成功");
} else {
System.out.println("没有该商品");
}
}
}
三. 系统优化总结
系统主要优化了以下功能:
- 改进ShoppingCart类中的add方法,将相同商品归为一类。
- 为Commodity类添加编号属性,用来唯一区别每一个不同的商品,确保商品编号唯一性。
- 增加专门的菜单类,用来显示菜单。
- 增加专门的类用来进行Commodity数据的初始化。
- 将ShoppingCart类的控制台输出代码(System.out.println…)全部移除。
- Commodity类的price为double类型不精确。在运算过程中会出现误差。使用BigDecimal类:BigDecimal类提供了高精度的十进制运算,避免浮点数运算的精度问题,使得运算结果精确。
- 在开始增加窗口显示商城商品。
- 利用购物车条目存储商品信息。
- 解决同一商品多次存储问题,在增加商品进入购物车时可以选择数量。