面向对象大作业--购物车

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的值,因此会正常运行。

posted @   陈小希  阅读(110)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示