零.人员分工
任务 | 姓名 |
---|---|
Commodity类;ShoppingCart类;面向对象设计; | 组长:林礼豪 |
Mall类;Main类;编码规范检查; | 洪希炀 |
Menu类;博客编写;前期调查与功能设计; | 陈炜棋 |
一.前期调查
调查了淘宝、拼多多、京东商城等电商的购物车设计,体验从搜索商品、加入购物车、编辑购物车、下单等的全过程。
以下用京东商城为例:
以下为购物车界面
二.系统功能结构图
三.系统描述
用户进入系统可以先将所有商品信息(编号、名称、价格)打印输出,之后可根据商品编号对商品进行查找或添加入购物车。在购物车中用户可以使用商品编号对其中商品进行查看、移除,也可以直接对购物车中的所有商品进行结算下单。
四.类设计说明
1.Main类(功能选择实现类)
概述:一个名为Main的Java类,代表一个简单的购物系统的主程序。
属性:
1.shoppingcart:一个购物车对象,用于存储用户选购的商品。
2.mall:一个商城对象,用于管理商品信息。
3.menu:一个菜单对象,用于显示用户界面菜单。
方法:
1.main(String[] args)方法:主程序入口,包含了程序的主要逻辑。在一个无限循环中,不断显示菜单并根据用户输入执行相应的操作。
2.AddToCart(Mall mall, ShoppingCart shoppingcart)方法:向购物车中添加商品的方法。用户输入商品编号和数量,然后将对应商品添加到购物车。
3.DisplayAllCommodities(Mall mall)方法:显示所有商品的方法,遍历商城中的商品列表并将它们打印出来。
4.SearchCommodity(Mall mall)方法:根据商品编号查找商品的方法,用户输入商品编号,然后查找并显示对应的商品信息。
5.DisplayCart(ShoppingCart shoppingcart)方法:显示购物车内容的方法,将购物车中的商品列表打印出来。
6.removeFromCart(ShoppingCart shoppingcart)方法:从购物车中移除商品的方法,用户输入要移除的商品编号,然后将该商品从购物车中移除。
7. CaculateOrder(ShoppingCart shoppingcart)方法:计算购物清单总价格的方法,将购物车中的商品价格汇总并显示。
2.Commodity类(商品信息类)
概述:一个名为Commodity的Java类,表示商品对象。
属性:
1.id:一个整数,表示商品的唯一编号。
2.name:一个字符串,表示商品的名称。
3.price:一个双精度浮点数,表示商品的价格。
方法:
1.Commodity()构造方法:无参构造方法。
2.Commodity(Integer id, String name, Double price)构造方法:带有参数的构造方法,用于初始化商品对象的属性。
3.getId()方法:获取商品的编号。
4.setId(Integer id)方法:设置商品的编号。
5.getName()方法:获取商品的名称。
6.setName(String name)方法:设置商品的名称。
7.getPrice()方法:获取商品的价格。
8.setPrice(Double price)方法:设置商品的价格。
9.hashCode()方法:重写Object类中的hashCode()方法,用于计算对象的哈希码。
10.equals(Object obj)方法:重写Object类中的equals()方法,用于比较两个商品对象是否相等。
11.toString()方法:重写Object类中的toString()方法,用于返回商品对象的字符串表示,包括商品编号、名称和价格。
3.Mall类(商品展示类)
概述:一个名为Mall的Java类,表示一个购物商城。
属性:
1.commoditie:一个私有属性,是一个List类型,用于存储商品对象Commodity的列表。
方法:
1.Mall()构造方法:初始化购物商城对象,创建了一个空的商品列表。
2.initCommodities()方法:初始化商品列表,创建了多个商品对象并将它们添加到commodities列表中。
3.getAllCommodities()方法:返回商品列表commodities,允许其他类访问所有商品的信息。
4.findCommodityById(int id)方法:根据商品编号(id)查找商品对象,如果找到则返回该商品对象,否则返回null。
5.getCommodities()方法:与getAllCommodities()方法相同,返回商品列表commodities。
4.Menu类(功能选择界面类)
概述:一个名为Menu的Java类,用于创建一个简单的超市菜单界面。
属性:无属性定义。
方法:
1.show方法:该方法用于显示超市菜单,它包括以下选项:
- 展示所有商品
- 根据编号查找商品
- 添加商品到购物车
- 查看购物车
- 将商品从购物车中移除
- 下单
- 退出程序
5.ShoppingCart类(购物车类)
概述:一个名为ShoppingCart的Java类,表示购物车对象。
属性:
1.itemList:一个私有属性,是一个`List`类型,用于存储购物车中的商品条目对象(ItemEntry)的列表。
方法:
1.ShoppingCart()构造方法:初始化购物车对象,创建了一个空的商品条目列表。
2.calculateTotalPrice()方法:计算购物车中商品的总价的方法,遍历购物车中的商品条目,将各个商品的价格和数量相乘,并将它们相加以计算总价。
3.addItem(Commodity commodity, int quantity)方法:向购物车中添加商品的方法。用户可以指定要添加的商品和数量。如果购物车中已存在相同的商品,则增加其数量;否则创建一个新的商品条目。
4.remove(Integer id)方法:从购物车中移除指定的商品的方法。用户可以指定要移除的商品的编号(id)。如果成功移除,则返回true;否则返回false。
5.findById(Integer id)方法:查找购物车中指定商品编号的商品条目的索引。如果找到,返回索引;否则返回-1。
6.displayItems()方法:显示购物车中的商品条目的方法,遍历购物车中的商品条目并将它们打印出来。
7.ItemEntry内部类:表示购物车中的商品条目对象。包括商品对象、数量等属性,以及相应的获取和设置方法。
五.本系统体现的面向对象的封装性
这个系统利用面向对象的封装原则,通过类的设计和属性与方法的封装,提高了代码的可维护性和扩展性。在购物车系统中,属性被私有化,只能通过类的方法访问和修改,确保数据的有效性和一致性,同时提供对外接口,不需了解内部实现细节即可调用。
六.项目包结构(package的划分)与关键代码
1.项目的包结构
项目的包结构(为什么要这样设计包结构?)
这样设计包结构可以方便我们针对不同类进行修改,更好地管理项目,让程序具有更高的可读性。
2.主要功能
部分功能流程图
(1)往购物车中添加商品
(2)将购物车中的商品移除
关键代码
(1)Main类
package shopping;
import java.util.*;
public class Main {
public static void main(String[] args) {
ShoppingCart shoppingcart=new ShoppingCart();
Mall mall=new Mall();
mall.initCommodities();
Menu menu=new Menu();
while(true) {
menu.show();
Scanner sc=new Scanner(System.in);
String choice=sc.next();
switch (choice) {
case "1":
DisplayAllCommodities(mall);
break;
case"2":
SearchCommodity(mall);
break;
case"3":
AddToCart(mall,shoppingcart);
break;
case"4":
DisplayCart(shoppingcart);
break;
case"5":
removeFromCart(shoppingcart);
break;
case"6":
CaculateOrder(shoppingcart);
break;
case"7":
System.out.println("感谢您的使用,再见!");
default:
System.out.println("您输入的数字不符合规范,请重新输入");
break;
}
}
}
public static void AddToCart(Mall mall,ShoppingCart shoppingcart)
{
Scanner sc = new Scanner(System.in);
System.out.println("请输入要添加的商品编号:");
int id = sc.nextInt();
System.out.println("请输入要添加的商品数量:");
int quantity = sc.nextInt();
Commodity commodity = mall.findCommodityById(id);
if (commodity != null) {
shoppingcart.addItem(commodity, quantity);
System.out.println("成功添加商品到购物车。");
} else {
System.out.println("未找到该商品。");
}
}
public static void DisplayAllCommodities(Mall mall)
{
List<Commodity>commodities=mall.getAllCommodities();
for (Commodity commodity : commodities) {
System.out.println(commodity);
}
}
public static void SearchCommodity(Mall mall)
{
Scanner sc=new Scanner(System.in);
System.out.println("请输入要查找的商品编号");
int id= sc.nextInt();
Commodity item=mall.findCommodityById(id);
if(item!=null)
{
System.out.println(item);
}else
{
System.out.println("未找到该商品");
}
}
public static void DisplayCart(ShoppingCart shoppingcart)
{
shoppingcart.displayItems();
}
public static void removeFromCart(ShoppingCart shoppingcart) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入要移除的商品编号:");
int id = sc.nextInt();
int index = shoppingcart.findById(id);
if (index != -1) {
shoppingcart.remove(index);
System.out.println("成功移除商品。");
} else {
System.out.println("商品不存在于购物车中。");
}
}
public static void CaculateOrder(ShoppingCart shoppingcart)
{
System.out.println("购物清单总价格位:");
shoppingcart.calculateTotalPrice();
}
}
(2)Menu类
package shopping;
import java.util.Scanner;
public class Menu {
public void show() {
System.out.println("*******************欢迎来到什么都有超市*****************");
System.out.println("\t(1)展示所有商品");
System.out.println("\t(2)根据编号查找商品");
System.out.println("\t(3)添加商品到购物车");
System.out.println("\t(4)查看购物车");
System.out.println("\t(5)将商品从购物车中移除");
System.out.println("\t(6)下单");
System.out.println("\t(7)退出程序");
System.out.println("***********************************************");
}
}
(3)Mall类
package shopping;
import java.util.ArrayList;
import java.util.List;
public class Mall {
private List<Commodity> commodities;
public Mall() {
commodities = new ArrayList<>();
}
public void initCommodities() {
Commodity c1 = new Commodity(1, "牛奶", 10.5);
Commodity c2 = new Commodity(2, "西瓜", 10.5);
Commodity c3 = new Commodity(3, "手机", 25.99);
Commodity c4 = new Commodity(4, "充电器", 8.88);
Commodity c5 = new Commodity(5, "小米", 4.26);
Commodity c6 = new Commodity(6, "花生", 3.99);
Commodity c7 = new Commodity(7, "牛奶", 32.00);
Commodity c8 = new Commodity(8, "洗发水", 23.88);
Commodity c9 = new Commodity(9, "锅", 55.03);
Commodity c10 = new Commodity(10, "泡面", 3.5);
commodities.add(c1);
commodities.add(c2);
commodities.add(c3);
commodities.add(c4);
commodities.add(c5);
commodities.add(c6);
commodities.add(c7);
commodities.add(c8);
commodities.add(c9);
commodities.add(c10);
}
public List<Commodity> getAllCommodities() {
return commodities;
}
public Commodity findCommodityById(int id) {
for (Commodity commodity : commodities) {
if (commodity.getId() == id) {
return commodity;
}
}
return null;
}
public List<Commodity> getCommodities() {
return commodities;
}
}
(4)Commodity类
package shopping;
import java.util.ArrayList;
import java.util.List;
public class Commodity {
private Integer id;
private String name;
private Double price;
public Commodity() {
}
public Commodity(Integer id, String name, Double price) {
this.id = id;
this.name = name;
this.price = price;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
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;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Commodity other = (Commodity) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
@Override
public String toString() {
return "编号=" + id + ", 商品=" + name + ", 价格=" + price + "]";
}
}
(5)ShoppingCart类
package shopping;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
public class ShoppingCart {
private List<ItemEntry> itemList;
public ShoppingCart() {
itemList = new ArrayList<>();
}
/**
* 计算购物车中商品的总价
* @return 总价
*/
public BigDecimal calculateTotalPrice() {
BigDecimal totalPrice = BigDecimal.ZERO;// 初始化总价为0
for (ItemEntry itemEntry : itemList) {
BigDecimal itemPrice = new BigDecimal(Double.toString(itemEntry.item.getPrice()));
int quantity = itemEntry.getQuantity();
BigDecimal itemTotalPrice = itemPrice.multiply(BigDecimal.valueOf(quantity));
totalPrice = totalPrice.add(itemTotalPrice);
}
return totalPrice;
}
/**
* 向购物车中添加商品
* @param commodity 要添加的商品
* @param quantity 商品数量
*/
public void addItem(Commodity commodity, int quantity) {
if (commodity == null || quantity <= 0) {
return;
}
for (ItemEntry itemEntry : itemList) {
if (itemEntry.getItem().equals(commodity)) {
itemEntry.setQuantity(itemEntry.getQuantity() + quantity);
return;
}
}
itemList.add(new ItemEntry(commodity, quantity));
}
/**
* 从购物车中移除指定的商品
* @param commodity 要移除的商品
* @return 如果成功移除则返回 true,否则返回 false
*/
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.getQuantity() <= 1) {// 当条目数量<1则删除条目
itemList.remove(index);
} else {
entry.decrease();
}
}
return true;
}
int findById(Integer id) {
for (int i = 0; i < itemList.size(); i++) {
if (itemList.get(i).getItem().getId().equals(id))
return i;
}
return -1;
}
/**
* 显示购物车中的商品条目
*/
public void displayItems() {
for (ItemEntry itemEntry : itemList) {
System.out.println(itemEntry);
}
}
/**
* 购物车中的商品条目类
*/
private class ItemEntry {
private Commodity item;
private int quantity;
public ItemEntry(Commodity item, int quantity) {
this.item = item;
this.quantity = quantity;
}
public Commodity getItem() {
return item;
}
public void decrease() {
quantity--;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public int getQuantity() {
return quantity;
}
public String toString() {
return "商品信息:[编号=" + item.getId() + ", 名称=" + item.getName()
+ ", 价格=" + item.getPrice() + ",数量=" + quantity + "]";
}
}
}