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

分工表格

任务姓名
类Main、类ShoppingCart;面向对象设计孔德丞(组长)
类Menu;前期调查与功能设计李云飞
类ShoppingMall;编码规范检查洪圣哲
类Menu,博客书写蔡岳恒

背景调查

京东商城有商品存储的地方,有购物车可以储存商品

可以得到以下关系图

系统关系图

面向对象的封装性

  1. 类的定义和组织:代码使用类来组织相关的数据和行为。每个类都有自己的属性和方法,通过封装将相关的数据和操作封装在一个类中。

  2. 类的访问修饰符:在给定的代码中,Commodity、ShoppingMall等类使用了默认访问修饰符,对外部代码不可见,从而隐藏了内部实现细节,提供了封装性。

  3. 类的成员访问控制:Commodity类中的属性name、price和id使用了私有访问修饰符,通过提供公共的getter和setter方法来访问和修改这些属性,从而控制了属性的访问权限,保护了数据的完整性。

  4. 方法的封装:Commodity类中的getter和setter方法用于封装对属性的访问和修改,通过这些方法可以控制属性的读写操作,隐藏了内部实现细节。

类设计说明:

  1. Commodity(商品类):该类用于存储商品的信息,包括商品名称、价格和唯一标识商品的编号属性。

  2. ShoppingMall(商场类):该类表示商场,包含一个名为inventory的属性,它是一个用于存储商品的HashMap。该类还有一个search方法,用于根据关键字在inventory中搜索匹配的商品并返回匹配的商品列表。

  3. ShoppingCart(购物车类):该类用于管理购物车中的商品。它具有添加商品、删除商品、更新商品数量、清空购物车等功能。

  4. Menu(菜单类):该类用于显示和获取用户的选择菜单,包括主菜单和子菜单。

类与类之间的关系:

  1. Main类中创建了ShoppingMall和ShoppingCart的实例,并通过它们之间的方法调用来实现购物功能。

  2. ShoppingMall类和Commodity类之间的关系:ShoppingMall类包含一个inventory属性,它是一个存储商品的Map,其中键是商品的名称,值是Commodity对象。通过该关系,ShoppingMall类可以对商品进行搜索。

  3. ShoppingCart类和Commodity类之间的关系:ShoppingCart类使用Commodity对象来管理购物车中的商品,可以添加、删除、更新商品数量等。

关键代码:

购物车添加商品的流程图:

开始 -> 显示商品列表 -> 输入要添加的商品名 -> 查找商品是否存在 -> 若存在,将商品添加到购物车 -> 结束

购物车添加商品的关键代码示例:

System.out.println("请输入商品名添加购物车");
String itemName = sc.nextLine();
Commodity item = shoppingMall.inventory.get(itemName);
if (item != null) {
    cart.add(item);
    System.out.println("商品已添加到购物车。");
} else {
    System.out.println("找不到该商品。请重新输入商品名称。");
}

购物车删除商品的流程图:

开始 -> 显示购物车中的商品列表 -> 输入要删除的商品名 -> 查找商品是否存在于购物车 -> 若存在,从购物车中删除商品 -> 结束

购物车删除商品的关键代码示例:

System.out.println("请输入要删除的商品名:");
String itemNameToRemove = sc.nextLine();
cart.remove(itemNameToRemove);
System.out.println("商品已从购物车中删除。");

代码

Commodity类

package edu.jmu.test;


/**
 * 商品类:用来存放商品的信息(商品名称name、商品价格price)。
 * 该类有待完善。比如,未包含能唯一标识商品的商品编号属性。
 */
public class Commodity {
	private String name;
	private double price;
	private String id;

	public Commodity(String name, double price,String id) {
		this.name = name;
		this.price = price;
		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;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}
}

Main类

package edu.jmu.test;

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

public class Main {

    public static void main(String[] args) {
        Commodity c1 = new Commodity("苹果", 10.5, "1");
        Commodity c2 = new Commodity("苹果", 10.5, "2");
        Commodity c3 = new Commodity("手机", 25.99, "3");
        Commodity c4 = new Commodity("Java教程", 8.88, "4");
        ShoppingMall shoppingMall = new ShoppingMall();
        shoppingMall.inventory.put("苹果", c1);
        shoppingMall.inventory.put("苹果", c2);
        shoppingMall.inventory.put("手机", c3);
        shoppingMall.inventory.put("Java教程", c4);
        ShoppingCart cart = new ShoppingCart();
        Scanner sc = new Scanner(System.in);
        /*cart.add(c1);
        cart.add(c2);
        cart.add(c3);
        cart.add(c4);*/
        //double x = cart.checkout();
        /*cart.show();
        System.out.println("数量" + cart.getQty());
        System.out.println("总价:" + x);*/
        int choice;
        do {
            Menu.displayMainMenu();
            choice = Menu.getUserChoice();

            switch (choice) {
                case 1:
                    handleSearch(shoppingMall);
                    break;
                case 2:
                    System.out.println("请输入商品名添加购物车");
                    String itemName = sc.nextLine();
                    Commodity item = shoppingMall.inventory.get(itemName);
                    if (item != null) {
                        cart.add(item);
                        System.out.println("商品已添加到购物车。");
                    } else {
                        System.out.println("找不到该商品。请重新输入商品名称。");
                    }
                    break;
                case 3:
                    System.out.println("请输入要删除的商品名:");
                    String itemNameToRemove = sc.nextLine();
                    cart.remove(itemNameToRemove);
                    System.out.println("商品已从购物车中删除。");
                    break;
                case 4:
                    cart.clear();
                    System.out.println("购物车已清空。");
                    break;
                case 5:
                    System.out.println("请输入商品名更新购物车中的商品数量:");
                    String itemNameToUpdate = sc.nextLine();
                    System.out.println("请输入新的商品数量:");
                    int newQuantity = sc.nextInt();
                    sc.nextLine(); // 消费掉输入缓冲区中的换行符
                    cart.updateQuantity(itemNameToUpdate, newQuantity);
                    System.out.println("商品数量已更新。");
                    break;
                case 6:
                    int quantity = cart.getQty();
                    System.out.println("购物车商品数量:" + quantity);
                    break;
                case 7:
                    cart.showItems();
                    break;
                case 8:
                    System.out.println("成功退出");
                    break;
                default:
                    System.out.println("错误的选择,请重新输入");
                    break;
            }
        } while (true);
    }

    private static void handleSearch(ShoppingMall shoppingMall) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("输入商品名称");
        String keyword = scanner.nextLine();

        List<Commodity> matchingCommodities = shoppingMall.search(keyword);
        if (matchingCommodities.isEmpty()) {
            System.out.println("没有匹配商品");
        } else {
            System.out.println("匹配的商品:");
            for (Commodity commodity : matchingCommodities) {
                System.out.println(commodity.getName());
            }
        }

        Menu.displaySubMenu();
        int choice = Menu.getUserChoice();
        if (choice == 1) {
            handleSearch(shoppingMall);
        }

    }

}

Menu类

package edu.jmu.test;

import java.util.Scanner;

public class Menu {
    static void displayMainMenu() {
        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. Exit");
    }

    static void displaySubMenu() {
        System.out.println("选择菜单");
        System.out.println("1. 重新输入");
        System.out.println("2. 返回主菜单");
    }

    static int getUserChoice() {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请选择: ");
        return scanner.nextInt();
    }
}

ShoppingCart类

package edu.jmu.test;

import edu.jmu.test.Commodity;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class ShoppingCart {
	private Map<Commodity, Integer> items = new HashMap<>(); // 存放商品和数量的容器

	public void add(Commodity item) {
		if (items.containsKey(item)) {
			int qty = items.get(item);
			items.put(item, qty + 1);
		} else {
			items.put(item, 1);
		}
	}
	public void remove(String itemName) {
		Commodity itemToRemove = null;
		for (Commodity commodity : items.keySet()) {
			if (commodity.getName().equals(itemName)) {
				itemToRemove = commodity;
				break;
			}
		}
		if (itemToRemove != null) {
			items.remove(itemToRemove);
		}
	}
	public void clear() {
		items.clear();
	}
	public void updateQuantity(String itemName, int newQuantity) {
		for (Map.Entry<Commodity, Integer> entry : items.entrySet()) {
			Commodity commodity = entry.getKey();
			if (commodity.getName().equals(itemName)) {
				entry.setValue(newQuantity);
				break;
			}
		}
	}
	public int getQty() {
		int qty = 0;
		for (int value : items.values()) {
			qty += value;
		}
		return qty;
	}

	public double checkout() {
		double total = 0;
		for (Map.Entry<Commodity, Integer> entry : items.entrySet()) {
			Commodity commodity = entry.getKey();
			int qty = entry.getValue();
			total += commodity.getPrice() * qty;
		}
		return total;
	}

	public void showQty() {
		for (Map.Entry<Commodity, Integer> entry : items.entrySet()) {
			Commodity commodity = entry.getKey();
			int qty = entry.getValue();
			printCommodity(commodity, qty);
			System.out.println();
		}
	}
	public void showItems() {
		for (Map.Entry<Commodity, Integer> entry : items.entrySet()) {
			Commodity commodity = entry.getKey();
			int qty = entry.getValue();
			printCommodity(commodity, qty);
			System.out.println();
		}
	}

	private void printCommodity(Commodity commodity, int qty) {
		System.out.printf("name: %s, price: %.2f, quantity: %d, id: %s", commodity.getName(), commodity.getPrice(), qty,commodity.getId());
	}
}

ShoppingMall类

package edu.jmu.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ShoppingMall {
    Map<String, Commodity> inventory;

    ShoppingMall() {
        inventory = new HashMap<>();
    }

    List<Commodity> search(String keyword) {
        // 商品搜索逻辑,根据关键字在inventory中查找匹配的商品
        // 返回匹配的商品列表
        List<Commodity> matchingCommodities = new ArrayList<>();
        for (Commodity commodity : inventory.values()) {
            if (commodity.getName().contains(keyword)) {
                matchingCommodities.add(commodity);
            }
        }
        return matchingCommodities;
    }
}

演示

搜索商品功能

添加功能

更新商品功能

展示购物车功能

展示商品数量功能

为什么要使用hashmap

使用HashMap作为购物车的容器是因为HashMap具有快速的查找和插入操作。在购物车中,我们需要根据商品来进行操作,包括添加、删除、更新商品的数量等。使用HashMap可以通过商品对象作为键来快速查找对应的数量。

另外,HashMap还允许存储键值对,这里的键是商品对象,值是对应的数量。这样可以确保购物车中的商品唯一,并且方便对每个商品的数量进行更新和计算总价。因此,使用HashMap作为购物车的容器是合理和有效的选择。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值