购物车程序的面向对象设计

目标:

  • 学会使用讲故事的方式找到系统中可能包含的类、属性、方法。
  • 思考:方法、属性应归入哪个类中?哪些属性与方法可以设置为static或非static?
  • 理解类、封装、模块化之间的关系。

 一、人员分工

任务姓名
Main类、Menu类、博客编写、系统功能结构图罗明
Commodity类、Mall类、前期调查和功能设计余代诚
Commodity类、Mall类、编码规范设计张俊毅
ShoppingCart类、编码规范设计、博客编写郑忻浩

 二、前期调查

调查了京东商城和亚马逊商城中的购物车,体验从搜索商品、加入购物车、操作购物车、下单的全过程。

三、系统功能结构图

四、系统描述

该系统是一个比较简单的购物车系统,使用者可以作为商城管理员体验添加商品到商城(包括商品初始化)、删除商城中的商品(指定编号或商品名或种类)、修改商城中的商品、查找商品。使用者也可以作为用户浏览商城中的商品、将商品添加到购物车、清除购物车中的某件商品、修改购物车中某商品的数量、清空购物车,购物车还能够自动统计商品种类数量以及计算商品总价。

 五、运行结果展示

1.进入菜单界面

2.显示初始商城中的商品

3.添加商品到商城

4.删除商品

5.查找商品

6.将商品添加入购物车

7.打开购物车

8.修改购物车中某商品的数量

9.删除特定商品

10.清空购物车

六、类设计说明,类概述(有什么用)、类的属性与方法、类与类之间的关系。

1.Main类(程序入口类):

概述:程序的入口以及方法的引用

方法:

       1.main  整个系统的主方法,负责创建类的对象以及调用别的类方法

       2.mallFunction(int choice, Scanner sc, Mall mall, ShoppingCart shoppingcart);调用商城相关的用法

       3.shoppingCart(ShoppingCart shoppingcart, Scanner sc);调用购物车相关的用法

2.Menu类(菜单、主操作类):

概述:显示用户可进行操作的菜单

方法:

        1.showMall()  展示商城类中的操作菜单

        2.showShoppingCart  展示购物车具有的相关操作菜单

3.Commodity类(商品类):

概述:展示某个商品的信息
属性:

        1.String name    商品名

        2.double price      商品价格

        3.int number      商品数量

        4.int id           商品编号

方法:

        1.getName()      获取商品名

        2.getPrice()      获取商品价格

        3.getNumber()        获取商品的数量

        4.getId()         获取商品的编号

        5.setName(String name)      设置商品名。

        6.setPrice(double price)       设置商品价格

        7.setNumber(int number)     设置商品在购物车中的数量。

        8.setId(int id)      设置商品编号。

4.Mall类(商城类):

概述:进行关于商城的一系列操作

属性:   mallList:List<Commodity>

方法:

        1.searchCommodityOfName(String name)      按照商品名搜索商品。

        2.addForMall(String name, double price, int id, String categoryName)    添加商品到商城。

        3.removeCommodityOfId(int id)       删除指定编号的商品。

        4.addForMall(String name, double price, int id, String categoryName)      添加商品到商城。

        5.addForShoppingCar(ShoppingCart car, int id):      将商品添加到购物车。

5.ShoppingCart类(购物车类):

概述:进行关于购物车的一系列操作

属性:items:List<Commodity>      存储购物车商品列表

方法:

       1.getItems()     获取购物车内所有商品。

       2.add(Commodity item)      结合addForShoppingCar将商品添加到购物车。

       3.getQty()     获取购物车商品种类的数量。

       4.checkout()      计算购物车内商品的总价。

       5.modifyNumber(int number, int id)      修改购物车内商品的数量。

七、本系统哪里体现了面向对象的封装性?

本系统在类中的属性和方法中体现了面向对象的封装性。每个类都有自己的属性和方法,将属性私有化通过提供公开的方法来访问和修改相关属性隐藏了类内部的具体实现,提高了代码的可维护性。

八、项目包结构(package的划分)与关键代码:项目的包结构(为什么要这样设计包结构),主要功能(如网购物车添加、删除商品)的流程图与关键代码。

这样设计大大增加了代码的规范性和可读性

主要功能图:

主要代码:

1.商城类

package shopping;

import java.util.ArrayList;
import java.util.List;


public class Mall {
	
	private List<Commodity> mallList = new ArrayList<>();

	public List<Commodity> getMallList() {
		return mallList;
	}
	
	public boolean addForMall(String name, double price, int id, String categoryName) {
		Commodity commodity=new Commodity();
		commodity.setName(name);
		commodity.setPrice(price);
		commodity.setId(id);
		commodity.setCategoryName(categoryName);
		int flag=searchCommodityOfId(id);
		if(flag<0) {//找不到才能添加
			this.mallList.add(commodity);
			return true;
		}
		return false;
	}
	
	/**
	 *选择是否添加到购物车
	 */
	public boolean addForShoppingCar(ShoppingCart car, int id) {
		int index=searchCommodityOfId(id);
		if(index<0)return false;
		else {
		car.add(mallList.get(index));
		return true;
		}
	}
	
	/**
	 * 删除指定编号的商品
	 */
	public boolean removeCommodityOfId(int id) {
		if(mallList.size()==0)return false;
		boolean flag=false;
		for(Commodity commodity : mallList) {
			if(commodity.getId()==id) {
				mallList.remove(commodity);
				flag=true;
				break;
			}
		}
		
		return flag;
	}
	
	/**
	 * 删除某件商品
	 */
	public boolean removeCommodityOfname(String name) {
		if(mallList.size()==0)return false;
		boolean flag=false;
		for(Commodity commodity : mallList) {
			if(commodity.getName().equals(name)) {
				mallList.remove(commodity);
				flag=true;
				break;
			}
		}
		return flag;
	}
	
	/**
	 * 修改成功返回true否则返回false
	 */
	public boolean modifyCommodity(int id1, String name, double price, int id2, String categoryName) {
		int temp=searchCommodityOfId(id1);
		int temp1=searchCommodityOfId(id2);//修改后编号不能和商城中的其他商品重复
		if(temp1>=0)return false;
		if(temp>=0) {
			mallList.get(temp).setName(name);
			mallList.get(temp).setPrice(price);
			mallList.get(temp).setId(id2);
			mallList.get(temp).setCategoryName(categoryName);
			return true;
		}
		return false;
	}
	
	/**
	 * 查找指定编号的商品
	 * @param id 待查找商品编号
	 * @return 若>=0则查找成功否则查找失败
	 */
	public int searchCommodityOfId(int id) {
		int index=-1;
		for(int i=0;i<mallList.size();i++) {
			if(mallList.get(i).getId()==id) {
				index=i;
				break;
			}
		}
		return index;
	}
	
	/**
	 * 查找相关商品。
	 * @param name 待查找的商品名
	 * @return 一个List表示所有查找到的商品
	 */
	public List<Commodity> searchCommodityOfName(String name){
		List<Commodity> items = new ArrayList<>();
		for(Commodity temp : mallList) {
			if(temp.getName().equalsIgnoreCase(name)) {
				items.add(temp);
			}
		}
		return items; 
	}
	
	/**
	 * 查找相关商品。
	 * @param name 待查找的种类名
	 * @return 一个List表示所有查找到的商品
	 */
	public List<Commodity> searchCommodityOfCategoryName(String categoryname){
		List<Commodity> items = new ArrayList<>();
		for(Commodity temp : mallList) {
			if(temp.getCategoryName().equalsIgnoreCase(categoryname)) {
				items.add(temp);
			}
		}
		return items; 
	}
	
}

2.购物车类

package shopping;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * 购物车类:可以用来存放商品,且包含购物车常用的操作方法。
 */
public class ShoppingCart {
	private List<Commodity> items = new ArrayList<>();//存放商品的容器
	
	
	public ShoppingCart() {
		
	}
	
	public List<Commodity> getItems() {
		return items;
	}

	/**
	 * 添加某件商品到购物车
	 */
	public void add(Commodity item) {
		int id = items.indexOf(item);
		if (id == -1) {
			items.add(item);
			item.setNumber(1);
		} else {
			items.get(id).addNumber();
		}
	}
	
	/**
	 * 获得购物车内商品(种类)的数量
	 * @return 购物车内商品的数量
	 */
	public int getQty() {
		return items.size();
	}
	
	/**
	 * 结算
	 * @return 返回购物车中所有商品的总价
	 */
	public double checkout() {
		double x = 0;
		for (Commodity commodity : items) {
			BigDecimal a=new BigDecimal(commodity.getPrice());//有点占内存
			BigDecimal b=new BigDecimal(commodity.getNumber());	
			x += a.multiply(b).doubleValue();
		}
		return x;
	}
	
	/**
	 * 修改某件商品的数量
	 */
	public boolean modifyNumber(int number, int id) {
		int index=searchCommodityOfId(id);
		if(index<0)return false;//编号错误
		if(number<=0)return false;//数量错误
		else {
			items.get(index).setNumber(number);
			return true;
		}
	}
	
	
	/**
	 * 清空购物车
	 */
	public void clear() {
		items.clear();
	}
	
	/**
	 * 删除某件商品(指定编号),相当于选中某商品
	 */
	public boolean remove(int id) {
		int index=searchCommodityOfId(id);
		if(index>=0) {
			items.remove(items.get(index));
			return true;
		}
		return false;
	}
	
	
	/**
	 * 查找指定编号的商品
	 * @param id 待查找商品编号
	 * @return 若>=0则查找成功否则查找失败
	 */
	public int searchCommodityOfId(int id) {
		int index=-1;
		for(int i=0;i<items.size();i++) {
			if(items.get(i).getId()==id) {
				index=i;
				break;
			}
		}
		return index;
	}
	
}

3.商品类

package shopping;


/**
 * 商品类:用来存放商品的信息(商品名称name、商品价格price、商品编号id、商品种类categoryName)。
 */
public class Commodity {
	private String name;
	private double price;
	private int number=0;//某件商品在购物车中的数量
	//private int numberInMall;//某件商品在商城中的数量
	private int id;//商品编号
	private String categoryName;//商品类别
	
	public Commodity() {
		
	}
	
//	public Commodity(String name, double price) {
//		this.name = name;
//		this.price = price;
//	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public double getPrice() {
		return price;
	}
	
	public void setPrice(double price) {
		this.price = price;
	}
	
	public void setNumber(int number) {
		this.number=number;
	}
	
	public int getNumber(){
		return this.number;
	}
	
	public void setId(int id) {
		this.id=id;
	}
	
	public int getId() {
		return this.id;
	}
	
	
	 public String getCategoryName() {
		return categoryName;
	}

	public void setCategoryName(String categoryName) {
		this.categoryName = categoryName;
	}

	public void addNumber() {
		this.number+=1;
	}
	
	public String toString() {
		return "商品编号:"+this.id+"\t商品名:"+this.name+"\t商品价格:"+this.price+"\t商品种类:"+this.categoryName;
	}
	
	public boolean equals(Object obj) {
	    if(obj==null)return false;
	    if(this==obj)return true;
	    if(obj instanceof Commodity) {
	        Commodity o1=(Commodity)obj;
	        if(this.name==null && o1.name==null)return this.price==o1.price;
	        else {
	        	if(this.name==null || o1.name==null)return false;
	        	return this.name.equals(o1.name)&&this.price==this.price;
	     	}
	    }else {
	        return false;
	    }
	 }
}

4.Main类

package ui;

import shopping.*;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		
		Mall mall = new Mall();
		ShoppingCart shoppingcart=new ShoppingCart();
		Menu menu=new Menu();
		Scanner sc = new Scanner(System.in);
		
		mall.addForMall("苹果", 10.5, 1005, "水果");
		mall.addForMall("手机", 1025.99, 1004, "电子产品");
		mall.addForMall("Java教程", 8.88, 1003, "书籍");
		//mall.addForMall("西瓜", 25.8, 1007, "水果");
		mall.addForMall("香蕉", 16.8, 1002, "水果");
		
		boolean runing=true;
		while(runing) {
			menu.showMall();
			int choice=sc.nextInt();
			runing=mallFunction(choice,sc,mall,shoppingcart,menu);
		}
		
		System.out.println("欢迎下次光临");
	}
	
	
	public static boolean mallFunction(int choice, Scanner sc, Mall mall, ShoppingCart shoppingcart,Menu menu) {
		boolean runing=true;
		String name;
		double price;
		int id;
		int id1;
		String categoryName;
		boolean temp;//判断操作是否成功
		List<Commodity> malllist=new ArrayList<>();
		int flag;//case 4中使用
		
		switch (choice) {
		case 1:
			System.out.println("请输入商品的名称:");
			name=sc.next();
			System.out.println("请输入商品的价格:");
			price=sc.nextDouble();
			System.out.println("请输入商品的编号:");
			id=sc.nextInt();
			System.out.println("请输入商品的种类:");
			categoryName=sc.next();
			temp=mall.addForMall(name, price, id, categoryName);
			if(temp)System.out.println("添加成功");
			else System.out.println("添加失败(商品重复添加)");
			//System.out.println("");
			//System.out.println("");
			break;
		case 2:
			System.out.println("请输入你要删除的商品编号:");
			id=sc.nextInt();
			temp=mall.removeCommodityOfId(id);
			if(temp)System.out.println("删除成功");
			else System.out.println("删除失败(请输入正确的编号)");
			break;
		case 3:
			System.out.println("请输入你要修改的商品编号:");
			id=sc.nextInt();
			
			System.out.println("请输入新的商品名称:");
			name=sc.next();
			System.out.println("请输入新的商品价格:");
			price=sc.nextDouble();
			System.out.println("请输入新的商品编号:");
			id1=sc.nextInt();
			System.out.println("请输入新的商品种类:");
			categoryName=sc.next();
			
			temp=mall.modifyCommodity(id, name, price, id1, categoryName);
			if(temp)System.out.println("修改成功");
			else System.out.println("修改失败(请输入正确的商品编号或检查新的编号是否重复)");
			
			break;
		case 4:
			System.out.println("请选择查询方式:1.商品名  2.商品种类  3.商品编号");
			flag=sc.nextInt();
			if(flag==1) {
				System.out.println("请输入商品名:");
				name=sc.next();
				malllist=mall.searchCommodityOfName(name);
				if(malllist.size()==0)System.out.println("无法查询到该商品");
				for(Commodity commodity : malllist) {
					System.out.println(commodity);
				}
			}else if(flag==2) {
				System.out.println("请输入商品种类:");
				categoryName=sc.next();
				malllist=mall.searchCommodityOfCategoryName(categoryName);
				if(malllist.size()==0)System.out.println("无法查询到相关商品");
				for(Commodity commodity : malllist) {
					System.out.println(commodity);
				}
			}else if(flag==3) {
				System.out.println("请输入商品编号:");
				id=sc.nextInt();
				int temp1=mall.searchCommodityOfId(id);
				if(temp1<0)System.out.println("未查找到该商品");
				else System.out.println(mall.getMallList().get(temp1));
			}else {
				System.out.println("输入错误自动返回");
			}
			break;
		case 5:
			malllist=mall.getMallList();
			if(malllist.size()==0)System.out.println("商城为空");
			for(Commodity commodity : malllist) {
				System.out.println(commodity);
			}
			break;
		case 6:
			System.out.println("请输入你要添加到购物车的商品的编号:");
			id=sc.nextInt();
			int temp1=mall.searchCommodityOfId(id);
			if(temp1>=0) {
				shoppingcart.add(mall.getMallList().get(temp1));
				System.out.println("添加成功");
			}else {
				System.out.println("添加失败(请输入正确的编号)");
			}
			break;
		case 7:
			shoppingCartFunction(shoppingcart, sc, menu);
			break;
		default:
			runing=false;
			break;
		}
		return runing;
	}
	
	public static void shoppingCartFunction(ShoppingCart shoppingcart, Scanner sc, Menu menu) {
		int choice;
		int id;
		int number;
		boolean temp;
		boolean runing=true;
		
		List<Commodity> items=shoppingcart.getItems();
		if(items.size()==0) {
			System.out.println("你的购物车为空(自动返回商城)");
			return;
		}else {
			System.out.println("你的购物车有商品如下:");
			for(Commodity commodity : items) {
				System.out.println(commodity+"\t商品数量:"+commodity.getNumber());
			}
			System.out.println("购物车商品种类数量:"+shoppingcart.getQty());
			System.out.print("所有商品总价:");
			System.out.printf("%.2f",shoppingcart.checkout());
			System.out.println();
		}
		
		
		menu.showShoppingCart();
		
		choice=sc.nextInt();
		
		
		switch (choice) {
		case 1:
			System.out.println("请输入你要修改的商品的编号:");
			id=sc.nextInt();
			System.out.println("请输入你要修改的商品的数量:(数量必须大于等于1)");
			number=sc.nextInt();
			temp=shoppingcart.modifyNumber(number, id);
			if(temp) {
				System.out.println("修改成功");
			}else {
				System.out.println("修改失败(请检查商品编号或商品数量是否符号规范)");
			}
			break;
		case 2:
			System.out.println("请输入你要删除的商品的编号");
			id=sc.nextInt();
			temp=shoppingcart.remove(id);
			if(temp) {
				System.out.println("删除成功");
			}else {
				System.out.println("删除失败");
			}
			break;
		case 3:
			shoppingcart.clear();
			break;
		default:
			runing=false;
			break;
		}
		if(runing)shoppingCartFunction(shoppingcart, sc, menu);
		else return;
	}

}


5.Menu类

package ui;


/**
 * 菜单类:提供给用户选择相应操作。
 *
 */
public class Menu {

	public Menu() {
		
	}
	
	public void showMall() {
		System.out.println("***********欢迎进入JMU-Mall***********");
		System.out.println("         1. 添加商品到商城");
		System.out.println("         2. 删除商品");
		System.out.println("         3. 修改商品");
		System.out.println("         4. 查找商品");
		System.out.println("         5. 显示全部商品");
		System.out.println("         6. 添加到我的购物车");
		System.out.println("         7. 打开我的购物车");
		System.out.println("         0. 退出");
		System.out.println("*************************************");
	}
	
	public void showShoppingCart() {
		System.out.println("***********你可以进行如下操作**********");
		System.out.println("         1. 修改商品数量");
		System.out.println("         2. 删除指定商品");
		System.out.println("         3. 清空购物车");
		System.out.println("         0. 退出");
		System.out.println("*************************************");
	}
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值