目录
八.本系统哪里体现了面向对象的封装性?可选:哪里体现了继承与多态?
九. 项目包结构(package的划分)与关键代码:项目的包结构(为什么要这样设计包结构),主要功能(如网购物车添加、删除商品)的流程图与关键代码
一.基本要求
在线上课程的购物车代码的基础上,改进与增加:
- 改进-购物车类:尝试解决同一商品多次存储问题,解决购物车内商品数量问题。
- 改进-商品类:建议只包含商品相关的数据。
- 新增-商城类:商品初始化、商品搜索。该类仅处理数据,不得出现控制台输入、输出。
- 新增-菜单类:主要用于处理输出的信息。比如,显示主菜单或子菜单。
- 新增-Main类:该类主要用于处理输入输出、调用其他类进行数据处理。
- 新增-界面相关类:用于处理不同功能的一系列输入输出、调用其他类进行数据处理。这些代码可放入Main类,也可从Main类中抽取出来形成一个独立的类。
- 新增-其他类:比如工具类、其他功能相关的类。
二. 分工表格
任务 | 名字 |
Main类,ShoppingCart类,ShoppingMall类,Commodity类,编写博客面向对象设计 | 包佳莉 |
Menu类,前期调查和功能设计,系统功能结构图,编码规范检查,UML类图 | 张子翔 |
三.前期调查
通过京东商城查询商品和物价如图所示:
四. 系统功能结构图
五.系统描述
一段用来描述系统功能与流程的文字,用红色字代表可能的对象(名词)或属性,用蓝色字代表可能的方法(动词)。
- 启动系统后,Main.java呈现菜单界面,用户可以选择进入商场或退出系统。
- 如果用户选择进入商场,Menu.java将控制传递给ShoppingMall.java,显示商场的商品列表包括商品编号,商品名称,商品单价。
- 用户可以在商场中选择商品并添加到购物车,也可以从购物车中移除商品或更新商品数量。
- ShoppingCart.java会根据用户的操作更新购物车的状态,并计算购物车的总价。
- 用户可以选择结账或继续购物,如果选择结账,会将购物车中的商品生成订单并完成支付。
- Main.java在用户完成结账后呈现一个退出菜单,用户可以选择退出系统或重新进入商场。
六. 功能运行结果展示:
1.主菜单
2.商品展示
3.购物车添加商品
对同一商品多次添加(ps:执行过一次删除后再添加):
4.购物车删除商品
5.查看购物车
6.清空购物车
7.退出系统
七. 类设计说明
类概述(每个类的用途)、类的关键属性与关键方法、类与类之间的关系。可选:类与类之间的关系可使用UML类图描述。建议使用ProcessOn绘制。
UML类图:
商品类:(初始化商城的商品,搜索商品)
- 私有成员变量
num
:一个整数,表示商品的编号。- 私有成员变量
name
:一个字符串,表示商品的名称。- 私有成员变量
price
:一个浮点数,表示商品的价格。- 构造方法
Commodity(int num, String name, double price)
:接受一个商品编号、名称和价格作为参数,创建一个商品对象。- 方法
getNum()
:返回商品对象的商品编号。- 方法
setNum(int num)
:设置商品对象的商品编号。- 方法
getName()
:返回商品对象的商品名称。- 方法
setName(String name)
:设置商品对象的商品名称。- 方法
getPrice()
:返回商品对象的商品价格。- 方法
setPrice(double price)
:设置商品对象的商品价格。(ps:由于都是对商品进行操作,我将购物车额外存在对数量的操作的类一起放到了商品类命名为CartCommodity)
1.私有成员变量 commodity:一个 Commodity 对象,表示购物车中的商品。
2.私有成员变量 quantity:一个整数,表示购物车中商品的数量。3.构造方法 CartCommodity(Commodity commodity, int quantity):接受一个商品对象和一 个
4.数量作为参数,创建一个购物车商品对象。
5.方法 getCommodity():返回购物车商品对象中的商品对象。
6.方法 getQuantity():返回购物车商品对象中的商品数量。
8.方法 setQuantity(int quantity):设置购物车商品对象中的商品数量。
主类:(调用其他类方法)
1.switch case:进行操作选择
菜单类:(打印购物车系统主菜单)
1.方法
printMainMenu()
:该方法使用System.out.println()
打印出购物系统的主菜单。菜单包括多个选项,每个选项对应一个购物系统的功能,如商城商品展示、购物车商品添加、购物车商品移除、查看购物车、清空购物车和退出系统
购物车类:(实现购物车增删 结算 查看 清空的功能)
- 私有成员变量
car
:一个HashMap
对象,用于存储购物车中的商品。其中,键是商品编号,值是CartCommodity
对象,表示购物车中的商品及其数量。- 方法
add(Commodity item, int quantity)
:向购物车中添加商品。如果商品已存在,则增加数量;否则,添加新的商品。- 方法
removeProduct(Commodity item, int quantity)
:从购物车中删除商品。如果商品存在且数量大于要删除的数量,则减少数量;否则,完全删除商品。- 方法
getQty()
:返回购物车中商品的总数量。- 方法
checkout()
:结算购物车中所有商品的总价show()
方法:显示购物车中的所有商品。调用printCommodity()
方法打印商品信息让用户查看购物车中的商品及其数量。clearCart()
方法:清空购物车中的所有商品。它调用HashMap
对象的clear()
方法来清空购物车让用户清空购物车,重新开始购物。printCommodity(Commodity commodity, int quantity)
方法:一个私有方法,用于打印商品信息。这个方法为show()
方法提供了支持,使得show()
方法能够方便地打印商品信息。
商场类(展示商城商品和商品的查询)
private static List<Commodity> items = new ArrayList<>();
:这一行定义了一个静态的列表,用来存储商品(Commodity)对象。public static List<Commodity> getItems() {...}
:这个静态方法返回上述列表,让外部可以获取当前商城中的所有商品。public static int getItemCount() {...}
:这个静态方法返回商品列表的长度,也就是商城中的商品数量。public void show() {...}
:这个方法遍历商品列表,并使用printCommodity()
方法打印每个商品的信息。private void printCommodity(Commodity commodity) {...}
:这个私有方法接收一个商品对象,然后按照格式打印出该商品的编号、名称和价格。public void addProduct(Commodity item) {...}
:这个方法接收一个商品对象,将其添加到商品列表中,也就是说,它允许将新的商品添加到商城。public Commodity getProductById(int id) {...}
:这个方法接收一个商品编号,遍历商品列表寻找匹配的商品,如果找到就返回该商品对象,也就是说,它允许根据商品编号从商城中获取商品。
八.本系统哪里体现了面向对象的封装性?可选:哪里体现了继承与多态?
本系统中,
CartCommodity
类和Commodity
类都体现了面向对象的封装性。在
CartCommodity
类中,商品对象和商品数量被封装在私有成员变量中,只能通过类的公有方法进行访问和修改。具体来说,getCommodity()
方法返回商品对象,getQuantity()
方法返回商品数量,setQuantity(int quantity)
方法设置商品数量。这种封装方式保护了成员变量的安全性,防止外部直接修改成员变量。在
Commodity
类中,商品编号、名称和价格也被封装在私有成员变量中,只能通过类的公有方法进行访问和修改。具体来说,getNum()
方法返回商品编号,getName()
方法返回商品名称,getPrice()
方法返回商品价格,setNum(int num)
方法设置商品编号,setName(String name)
方法设置商品名称,setPrice(double price)
方法设置商品价格。这种封装方式同样保护了成员变量的安全性,防止外部直接修改成员变量。至于继承与多态,在本系统中没有直接体现。所有的类都是独立的,没有继承关系。同时,也没有使用接口或抽象类来定义公共的行为,因此也没有多态的体现
九. 项目包结构(package的划分)与关键代码:项目的包结构(为什么要这样设计包结构),主要功能(如网购物车添加、删除商品)的流程图与关键代码
项目包结构:
- shopping:
- Menu.java (菜单类)
- Main.java (主类进入系统)
- ShoppingMall.java (商场类)
- Commodity.java (商品类)
- ShoppingCart.java (购物车类)
主要功能的流程图:
显示主菜单->初始化商城->添加商品到购物车->展示购物车商品->计算总价总数->退出系统
关键代码:
主类:
import java.util.List;
import java.util.Scanner;
public class Main {
private static List<Commodity> items;
private static List<ShoppingMall> mall;
public static void main(String[] args) {
//商城初始化
ShoppingMall shoppingMall = new ShoppingMall();
shoppingMall.addProduct(new Commodity(001, "茅台", 3299.0));
shoppingMall.addProduct(new Commodity(002, "五粮液", 629.0));
shoppingMall.addProduct(new Commodity(003, "拉菲", 119.0));
shoppingMall.addProduct(new Commodity(004, "天鹅庄", 698.0));
Menu s = new Menu();
ShoppingCart cart = new ShoppingCart();
Scanner sc = new Scanner(System.in);
while (true) {
s.printMainMenu();
System.out.println("请输入想要执行的操作:");
int choice = sc.nextInt();
switch (choice) {
case 0:
shoppingMall.show();
break;
case 1:
System.out.println("请输入商品编号:");
int num = sc.nextInt();
System.out.println("请输入要添加商品数量:");
int quantity = sc.nextInt();
Commodity product = shoppingMall.getProductById(num);
if (product != null) {
System.out.println("Found product: " + product.getName());
} else {
System.out.println("Product not found");
}
cart.add(product, quantity);
System.out.println("购物车内现有商品总数:" + cart.getQty());
cart.show();
break;
case 2:
System.out.println("请输入对应商品编号:");
int num2 = sc.nextInt();
System.out.println("请输入要删除商品数量:");
int quantity2 = sc.nextInt();
Commodity products = shoppingMall.getProductById(num2);
cart.removeProduct(products, quantity2);
System.out.println("购物车内现有商品总数:" + cart.getQty());
cart.show();
break;
case 3:
cart.show();
break;
case 4:
System.out.println("购物车清空成功( ̄︶ ̄)");
double total = cart.checkout();
System.out.println("总花销:" + total + "¥");
cart.clearCart();
System.out.println("购物车里空空如也");
break;
case 5:
System.out.println("------------------------------------");
System.out.println("*********** 欢迎下次光临! ***********");
System.out.println("------------------------------------");
return;
default:
System.out.println("操作执行失败>﹏<,请重新选择:");
break;
}
}
}
}
购物车类:
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ShoppingCart {
private Map<Integer, CartCommodity> car = new HashMap<>();//存放商品的容器
//private static List<ShoppingMall> mall;
/**
* 往购物车里面存放商品。
* 该方法会检查商品是否已存在,如果存在则增加数量,否则添加新的商品。
*
* @param item 要添加的商品
* @param quantity 要添加的数量
*/
public void add(Commodity item, int quantity) {
int num = item.getNum();
if (car.containsKey(num)) { // 如果商品已存在,增加数量
CartCommodity existingCommodity = car.get(num);
existingCommodity.setQuantity(existingCommodity.getQuantity() + quantity);
} else { // 否则,添加新的商品
car.put(num, new CartCommodity(item, quantity));
}
}
/**
* 往购物车里面存放商品。
* 该方法会检查商品是否已存在,如果存在则增加数量,否则添加新的商品。
*
* @param item 要删除的商品
* @param quantity 要删除的数量
*/
public void removeProduct(Commodity item, int quantity) {
int num = item.getNum();
if (car.containsKey(num)) { // 如果商品已存在,减少数量
CartCommodity existingCommodity = car.get(num);
int currentQuantity = existingCommodity.getQuantity();
if (currentQuantity > quantity) { // 如果要删除的数量小于当前数量,减少数量
existingCommodity.setQuantity(currentQuantity - quantity);
} else { // 否则,完全删除商品
car.remove(num);
}
}
}
/**
* 获得购物车内商品的数量(注意,这是商品的总数量,不是商品的种类数)
*
* @return 购物车内商品的总数量
*/
public int getQty() {
int totalQuantity = 0;
for (CartCommodity commodity : car.values()) {
totalQuantity += commodity.getQuantity();
}
return totalQuantity;
}
/**
* 结算
*
* @return 返回购物车中所有商品的总价
*/
public double checkout() {
double totalPrice = 0;
for (CartCommodity commoditys : car.values()) {
Commodity commodity = commoditys.getCommodity();
totalPrice += commodity.getPrice() * commoditys.getQuantity();
}
return totalPrice;
}
/**
* 显示购物车中的商品
*/
public void show() {
for (CartCommodity commoditys : car.values()) {
Commodity commodity = commoditys.getCommodity();
int quantity = commoditys.getQuantity();
printCommodity(commodity, quantity);
System.out.println();
}
}
/**
* 清空购物车中的商品
*/
public void clearCart() {
car.clear();
}
private void printCommodity(Commodity commodity, int quantity) {
System.out.printf("商品信息:【商品编号: %03d, 商品名称: %s, 商品价格: %f¥, 数量: %d】", commodity.getNum(), commodity.getName(), commodity.getPrice(), quantity);
}
}
商城类:
package shopping;
import java.util.ArrayList;
import java.util.List;
public class ShoppingMall {
private static List<Commodity> items= new ArrayList<>();
public static List<Commodity> getItems() {
return items;
}
public static int getItemCount() {
return items.size();
}
public void show() {
for (Commodity commodity : items) {
printCommodity(commodity);
System.out.println();
}
}
private void printCommodity(Commodity commodity) {
System.out.printf("商品信息:【商品编号: %03d, 商品名称: %s, 商品价格: %f¥】", commodity.getNum(), commodity.getName(), commodity.getPrice());
}
public void addProduct(Commodity item) {
items.add(item);
}
public Commodity getProductById(int id) {
for (Commodity product : items) {
if (product.getNum() == id) {
return product;
}
}
return null;
}
}
菜单类:
public class Menu {
public static void printMainMenu() {
System.out.println("------------------------------------");
System.out.println("*********欢迎来到购物者的天堂!*********");
System.out.println("------------------------------------");
System.out.println(" [0] 商城商品展示😏");
System.out.println(" [1] 购物车商品添加😊");
System.out.println(" [2] 购物车商品移除🙁");
System.out.println(" [3] 查看购物车😘");
System.out.println(" [4] 清空购物车😄");
System.out.println(" [5] 退出系统(ㄒoㄒ)");
System.out.println("------------------------------------");
}
}
商品类:
/**
* 商品类:用来存放商品的信息(商品名称name、商品价格price等等)。
* 该类包含能唯一标识商品的商品编号属性。
*/
public class Commodity {
private int num;
private String name;
private double price;
public Commodity(int num, String name, double price) {
this.num = num;
this.name = name;
this.price = price;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
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;
}
}
class CartCommodity {
private Commodity commodity;
private int quantity;
public CartCommodity(Commodity commodity, int quantity) {
this.commodity = commodity;
this.quantity = quantity;
}
public Commodity getCommodity() {
return commodity;
}
public void setCommodity(Commodity commodity) {
this.commodity = commodity;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
}