一、人员分工
任务 | 姓名 |
---|---|
第1次任务-面向对象设计(购物车) | 王五辈 |
二、前期调查
1、搜索商品
2.查看商品信息
3.操作购物车
三、系统功能结构图
四、系统描述
用户进入本系统时可以选择对商城或购物车进行操作,若先对商城进行操作 可以查看商城内所有商品(商品名、单价、商品编号),也可以根据id进行查找商品,查看某个商品的信息。然后用户可以使用商品id进行加入购物车的操作。在购物车内用户可以查看购物车内所有商品信息以及要购买的数量。可以改变购买某个商品的数量,也可以删除某个商品,清空购物车。也可以进行全部商品或是单独几个商品的结算,也能看到所有商品的总价。
若是管理员,还能在商城功能上删除、添加、改变商品。
五、类设计说明
UML类图
六、本系统哪里体现了面向对象的封装性?可选:哪里体现了继承与多态?
在购物车系统中,面向对象的封装性主要体现在以下几个方面:
-
数据的封装:购物车中需要保存商品信息、购物车中的商品数量、总价等数据。这些数据可以封装在一个购物车类中。
-
方法的封装:购物车、商城中需要实现添加商品、删除商品、修改商品等功能,这些操作可以封装在购物车、商城类的方法中,使得外部调用者只需要调用接口而无需了解内部实现细节。
本系统并无体现继承以及多态,如果要体现继承与多态,可以在商品类上进行实现,可以定义一个基类Commodity,然后派生出不同的子类来表示不同的商品种类。
七、项目包结构(package的划分)与关键代码:项目的包结构(为什么要这样设计包结构),主要功能(如网购物车添加、删除商品)的流程图与关键代码。
包结构
将功能分为两块,一为与商品有关的类,另一个为处理输入输出的类,通过将相关的类放在同一个包内,可以提高代码的可读性和可维护性。而且将不同功能的代码放入不同的包中,可以实现功能的隔离。这样一来,如果需要修改某个功能,只需要关注该功能所在的包,而无需关心其他包中的代码,减少了代码耦合度,提高了代码的可维护性。
关键代码
Commodity
public class Commodity {
private String name;
private double price;
private Integer id;
public Commodity(String name, double price, Integer id) {
this.name = name;
this.price = price;
this.id = id;
}
@Override
public String toString() {
return "Commodity: " + "[name = " + name + ", price = " + price + ", 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;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
ShoppingCart
public class ShoppingCart {
//存储购物车内商品及数量信息
private final List<CommodityEntry> commodityEntryList = new ArrayList<>();
//静态内部类 将商品和数量 放在一个类力
private static class CommodityEntry{
Commodity commodity;
int sum;
public CommodityEntry(Commodity commodity, int sum) {
this.commodity = commodity;
this.sum = sum;
}
@Override
public String toString() {
return commodity.toString() + ", sum = " + sum;
}
}
//查找 commodityEntryList 中 此id 所对应的那个 i
public int getI(Integer id){
for(int i = 0; i < commodityEntryList.size(); i++){
if(commodityEntryList.get(i).commodity.getId().equals(id)){
return i;
}
}
return -1;
}
//添加商品进入购物车
public boolean add(Commodity commodity, int sum){
if(getI(commodity.getId()) == -1){
commodityEntryList.add(new CommodityEntry(commodity, sum));
return true;
}
else{
commodityEntryList.get(getI(commodity.getId())).sum += sum;
return false;
}
}
//在购物车中删除商品
public boolean remove(Integer id){
if(getI(id) == -1){
return false;
}
commodityEntryList.remove(getI(id));
return true;
}
//修改购物车内商品数量
public boolean set(Integer id, int sum){
if(getI(id) != -1){
commodityEntryList.get(getI(id)).sum = sum;
return true;
}
return false;
}
//清空购物车
public void clear(){
commodityEntryList.clear();
}
//计算购物车内商品总价
public double calculateSum(){
double sumPrice = 0;
for(CommodityEntry commodityEntry: commodityEntryList){
sumPrice += commodityEntry.sum * commodityEntry.commodity.getPrice();
}
return sumPrice;
}
//购买商品
public double calculateSum(String[] strings){
double sumPrice = 0;
if(strings[0].equals("All")){
sumPrice = calculateSum();
clear();
}
else{
for (String string : strings) {
Integer id = Integer.valueOf(string);
int index = getI(id);
sumPrice += commodityEntryList.get(index).commodity.getPrice() * commodityEntryList.get(index).sum;
remove(id);
}
}
return sumPrice;
}
//输出购物车内商品列表
public boolean showShoppingCart(){
for(CommodityEntry commodityEntry : commodityEntryList){
System.out.println(commodityEntry);
}
return commodityEntryList.isEmpty();
}
}
ShoppingMall
public class ShoppingMall {
//存储商品信息
private final Map<Integer, Commodity> commodityEntry = new HashMap<>();
//增加商品
public boolean put(Commodity commodity){
if(commodityEntry.containsKey(commodity.getId())){
return false;
}
commodityEntry.put(commodity.getId(), commodity);
return true;
}
//通过id获取商品
public Commodity getValue(Integer id){
return commodityEntry.get(id);
}
//展示全部商品列表
public boolean showShoppingMall(){
Set<Map.Entry<Integer, Commodity>> entries = commodityEntry.entrySet();
for(Map.Entry<Integer, Commodity> mp : entries){
System.out.println(mp.getValue());
}
return commodityEntry.isEmpty();
}
//删除商品
public Commodity remove(Integer id){
return commodityEntry.remove(id);
}
//修改商品信息
public boolean set(Integer id, Commodity commodity){
if(!commodityEntry.containsKey(id)){
return false;
}
commodityEntry.put(id, commodity);
return true;
}
//以商品编号来查找商品
public Commodity find(Integer id){
return commodityEntry.get(id);
}
}
Main
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
ShoppingMall shoppingMall = new ShoppingMall();
shoppingMall.put(new Commodity("手机",1000, 1001));
shoppingMall.put(new Commodity("洗衣液",2000, 1002));
shoppingMall.put(new Commodity("笔记本",3000, 1003));
shoppingMall.put(new Commodity("水壶",4000, 1004));
shoppingMall.put(new Commodity("手表",5000, 1005));
shoppingMall.put(new Commodity("耳机",6000, 1006));
shoppingMall.put(new Commodity("鼠标",7000, 1007));
shoppingMall.put(new Commodity("键盘",8000, 1008));
shoppingMall.put(new Commodity("行李箱",9000, 1009));
shoppingMall.put(new Commodity("手环",10000, 1010));
ShoppingCart shoppingCart = new ShoppingCart();
shoppingCart.add(shoppingMall.getValue(1001), 10);
shoppingCart.add(shoppingMall.getValue(1002), 20);
shoppingCart.add(shoppingMall.getValue(1003), 30);
shoppingCart.add(shoppingMall.getValue(1004), 40);
shoppingCart.add(shoppingMall.getValue(1005), 50);
while(true) {
Menu.mainMenu();
boolean loop =false;
switch (scanner.nextInt()) {
case 1:
Menu.ShoppingMallMenu();
int n = scanner.nextInt();
switch (n){
case 1:
if(shoppingMall.showShoppingMall()){
System.out.println("商品列表为空");
}
break;
case 2:
System.out.println("请输入商品的编号");
Integer id = scanner.nextInt();
System.out.println("请输入商品的名称");
String name = scanner.next();
System.out.println("请输入商品的价格");
double price = scanner.nextDouble();
if(shoppingMall.put(new Commodity(name, price, id))){
System.out.println("添加成功");
} else{
System.out.println("商品已存在,加入失败");
}
break;
case 3:
System.out.println("请输入商品的编号");
if(shoppingMall.remove(scanner.nextInt()) == null){
System.out.println("删除失败,不存在改商品");
} else{
System.out.println("删除成功");
}
break;
case 4:
System.out.println("请输入商品的编号");
id = scanner.nextInt();
System.out.println("请输入商品的名称");
name = scanner.next();
System.out.println("请输入商品的价格");
price = scanner.nextDouble();
if(shoppingMall.set(id, new Commodity(name, price, id))){
System.out.println("不存在该商品,修改失败");
} else{
System.out.println("修改成功");
}
break;
case 5:
System.out.println("请输入要查找的商品编号");
Commodity commodity = null;
if( (commodity= shoppingMall.find(scanner.nextInt())) != null){
System.out.println(commodity);
}else{
System.out.println("该商品不存在,查找失败");
}
break;
case 6:
break;
case 7:
loop = true;
break;
}
break;
case 2:
Menu.ShoppingCartMenu();
switch(scanner.nextInt()){
case 1:
if(shoppingCart.showShoppingCart()){
System.out.println("购物车为空");
}
break;
case 2:
System.out.println("请输入商品的编号 以及购买数量");
if(shoppingCart.add(shoppingMall.getValue(scanner.nextInt()), scanner.nextInt())){
System.out.println("添加成功");
} else {
System.out.println("购物车内已有,增加购买数量");
}
break;
case 3:
System.out.println("请输入要删除的商品的编号");
if(!shoppingCart.remove(scanner.nextInt())){
System.out.println("购物车内没有该商品,删除失败");
}
else{
System.out.println("删除成功");
}
break;
case 4:
System.out.println("请输入更改的商品编号 以及购买数量");
if(shoppingCart.set(scanner.nextInt(), scanner.nextInt())){
System.out.println("更改成功");
} else{
System.out.println("购物车内无此商品, 更改失败");
}
break;
case 5:
shoppingCart.clear();
break;
case 6:
System.out.println("要购买全部商品吗?Yes or No");
String str = scanner.next();
if(str.equals("Yes")){
String[] strings = {"All"};
System.out.println("您需要支付:" + shoppingCart.calculateSum(strings));
}else {
System.out.println("请输入要购买的商品编号");
str = scanner.nextLine();
String s = scanner.nextLine();
String[] strings = s.split(" ");
System.out.println("您需要支付:" + shoppingCart.calculateSum(strings));
}
break;
case 7:
System.out.println("购物车内商品总价为: " + shoppingCart.calculateSum());
break;
case 8:
break;
case 9:
loop = true;
break;
}
break;
case 3:
loop = true;
}
if(loop) break;
}
}
}
Menu
public class Menu {
public static void mainMenu(){
System.out.println("***************欢迎使用购物车功能***************");
System.out.println(" 1. 查看商城");
System.out.println(" 2. 查看购物车");
System.out.println(" 3. 退出");
System.out.println("*********************************************");
System.out.println("请输入你的选择:(1 ~ 2)");
}
public static void ShoppingMallMenu(){
System.out.println("**************欢迎使用商城功能******************");
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("*********************************************");
System.out.println("请输入你的选择:(1 ~ 6)");
}
public static void ShoppingCartMenu(){
System.out.println("**************欢迎使用购物车功能******************");
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(" 8. 退出至主菜单");
System.out.println(" 9. 退出");
System.out.println("*********************************************");
System.out.println("请输入你的选择:(1 ~ 8)");
}
}