面向对象大作业--购物车
0.人员参与(学号,姓名)
202121333008 赖雯涛 商品类、商场类、主函数编写,流程设计、前期调查与功能设计
202121333007 陈欣欣 订单类、购物车类、博客编写
1.前期调查与功能设计
下面是京东商城的浏览界面:
购物车界面:
从图中我们可以看到京东商城里的浏览界面是包含搜索栏、购物车、下面是商品分类(家用电器、手机、电脑、家纺等),右侧还有登录账号
通过调查,整个程序可以分为几个类--商场类、用户类、购物车类、订单类。
2.以下是整个程序的思维导图:
3.系统描述:
用户通过登录网上购物账号,首先通过浏览 商品界面,选好需要的物品,确定样式和数量,加入购物车,最后结算。
4.类设计说明:
商场类:展示商品。
用户类:属性:账号;方法:加购,结算。
购物车类:属性:商品订单;方法:添加,删除,清空。
订单类:给单种商品形成订单。
设计思想(大致过程):
5.本系统哪里体现了面向对象的封装性?
不同的类中有不同的对象,可以分块完成每个对象需要的操作而跟其他类无关,从而体现了面对对象的封装性。
6.关键代码:主要功能(如网购物车添加、删除商品)的流程图与关键代码。
商场类:展示所有商品
class Mall{
ArrayList<Commodity> goods=new ArrayList<>();
Commodity a=new Commodity("蓝月亮洗衣液",29.8);
Commodity b=new Commodity("洁面乳",55);
Commodity c=new Commodity("瓜子",10.9);
Commodity d=new Commodity("杯具套装",668);
{
goods.add(a);
goods.add(b);
goods.add(c);
goods.add(d);
}
public Mall() {
super();
}
public void disp() {
for (Commodity e : goods) {
System.out.println("商品名称:"+e.name+"\n单价:"+e.price);
}
}
}
商品类:定义了商品的名称和单价属性
class Commodity{
String name;
double price;
public Commodity() {
}
public Commodity(String name, double price) {
this.name = name;
this.price = price;
}
@Override
public String toString() {
return "Commodity [name=" + name + ", price=" + price + "]";
}
}
订单类:为每一个加入购物车的商品创建一个订单,属性包含商品名称,所加数量,商品单价。方法有创建订单。
class Order{
String name_commodity;
int count;
double price_commodity;
public Order() {
}
public Order(String name_commodity, int count, double price_commodity) {
super();
this.name_commodity = name_commodity;
this.count = count;
this.price_commodity = price_commodity;
}
public Order(String name_commodity) {
super();
this.name_commodity = name_commodity;
}
@Override
public String toString() {
return "Order [name_commodity=" + name_commodity + ", count=" + count + ", price_commodity=" + price_commodity+ "]";
}
}
购物车类:将所有生成订单的商品加入购物车,用数组存储。方法有添加商品、清空购物车、删除指定商品、结算、输出所有商品。
class Cart{
ArrayList<Order> shopList = new ArrayList<>();
public Cart() {
}
public void addToCart(Commodity c, int n){
//改进:唯一性判断
for(Order e:shopList) {
if(e.name_commodity.equals(c.name)) {
e.price_commodity=e.price_commodity/e.count;//保证单价不被改变
e.count+=n;
e.price_commodity=e.price_commodity*e.count;
return;
}
}
Order a=new Order(c.name,n,c.price*n);
shopList.add(a);
}
public void cleanCart() {
shopList.clear();
}
public void delete(String name) {
int count=0;
for(Order ord:shopList) {
count++;
}
for(int i=0;i<count;i++) {
if(shopList.get(i).name_commodity.equals(name))
{
shopList.remove(i);
}
}
}
public void disp() {
for (Order e : shopList) {
System.out.println("name="+e.name_commodity+" num="+e.count+" price="+e.price_commodity);
}
}
public double calc() {
double x = 0;
for (Order e : shopList) {
x += e.price_commodity;
}
return x;
}
}
运行界面:
商场:
加入购物车
从购物车里删除订单
删除前:
删除后:
结算:
7.遇到的问题与解决方式:
问题:使用foreach遍历数组并删除或添加元素出现报错
原因:不能使用foreach删除或添加元素,foreach方式遍历元素的时候,是生成iterator,然后使用iterator遍历。在生成iterator的时候,会保存一个expectedModCount参数,这个是生成iterator的时候List中修改元素的次数。如果你在遍历过程中删除元素,List中modCount就会变化,如果这个modCount和exceptedModCount不一致, 就会抛出异常。这个是为了安全的考虑。如果使用iterator遍历过程中,使用List修改了元素,可能会出现不正常的现象。如果使用iterator的remove方法则会正常,因为iterator的remove方法会在内部调用List的remove方法,但是会修改excepedModCount的值,因此会正常运行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理