【第1次任务:购物车程序的面向对象设计】

目录

一.基本要求

二. 分工表格

三.前期调查

四. 系统功能结构图

五.系统描述

六. 功能运行结果展示:

1.主菜单

2.商品展示

3.购物车添加商品

4.购物车删除商品

5.查看购物车

6.清空购物车

7.退出系统

七. 类设计说明

UML类图:

商品类:(初始化商城的商品,搜索商品)

主类:(调用其他类方法)

菜单类:(打印购物车系统主菜单)

 购物车类:(实现购物车增删 结算 查看 清空的功能)

商场类(展示商城商品和商品的查询)

八.本系统哪里体现了面向对象的封装性?可选:哪里体现了继承与多态?

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

项目包结构:

 主要功能的流程图:

关键代码:

主类:

购物车类:

商城类:

菜单类:

商品类


一.基本要求

在线上课程的购物车代码的基础上,改进与增加:

  1. 改进-购物车类:尝试解决同一商品多次存储问题,解决购物车内商品数量问题。
  2. 改进-商品类:建议只包含商品相关的数据。
  3. 新增-商城类:商品初始化、商品搜索。该类仅处理数据,不得出现控制台输入、输出。
  4. 新增-菜单类:主要用于处理输出的信息。比如,显示主菜单或子菜单。
  5. 新增-Main类:该类主要用于处理输入输出、调用其他类进行数据处理。
  6. 新增-界面相关类:用于处理不同功能的一系列输入输出、调用其他类进行数据处理。这些代码可放入Main类,也可从Main类中抽取出来形成一个独立的类。
  7. 新增-其他类:比如工具类、其他功能相关的类。

二. 分工表格

任务名字
Main类,ShoppingCart类,ShoppingMall类,Commodity类,编写博客面向对象设计包佳莉
Menu类,前期调查和功能设计,系统功能结构图,编码规范检查,UML类图张子翔

三.前期调查

通过京东商城查询商品和物价如图所示:

    

    

四. 系统功能结构图

 

五.系统描述

一段用来描述系统功能与流程的文字,用红色字代表可能的对象(名词)或属性,用蓝色字代表可能的方法(动词)。

  1. 启动系统后,Main.java呈现菜单界面,用户可以选择进入商场或退出系统。
  2. 如果用户选择进入商场,Menu.java将控制传递给ShoppingMall.java,显示商场的商品列表包括商品编号商品名称商品单价
  3. 用户可以在商场中选择商品并添加购物车,也可以从购物车中移除商品或更新商品数量
  4. ShoppingCart.java会根据用户的操作更新购物车的状态,并计算购物车的总价
  5. 用户可以选择结账或继续购物,如果选择结账,会将购物车中的商品生成订单并完成支付。
  6. Main.java在用户完成结账后呈现一个退出菜单,用户可以选择退出系统或重新进入商场。

 

六. 功能运行结果展示:

1.主菜单

  

2.商品展示

  

3.购物车添加商品

  

对同一商品多次添加(ps:执行过一次删除后再添加):

4.购物车删除商品

  

5.查看购物车

  

6.清空购物车

   

7.退出系统

  

七. 类设计说明

类概述(每个类的用途)、类的关键属性与关键方法、类与类之间的关系。可选:类与类之间的关系可使用UML类图描述。建议使用ProcessOn绘制。

UML类图:

商品类:(初始化商城的商品,搜索商品)

  1. 私有成员变量 num:一个整数,表示商品的编号。
  2. 私有成员变量 name:一个字符串,表示商品的名称。
  3. 私有成员变量 price:一个浮点数,表示商品的价格。
  4. 构造方法 Commodity(int num, String name, double price):接受一个商品编号、名称和价格作为参数,创建一个商品对象。
  5. 方法 getNum():返回商品对象的商品编号。
  6. 方法 setNum(int num):设置商品对象的商品编号。
  7. 方法 getName():返回商品对象的商品名称。
  8. 方法 setName(String name):设置商品对象的商品名称。
  9. 方法 getPrice():返回商品对象的商品价格。
  10. 方法 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() 打印出购物系统的主菜单。菜单包括多个选项,每个选项对应一个购物系统的功能,如商城商品展示、购物车商品添加、购物车商品移除、查看购物车、清空购物车和退出系统

 购物车类:(实现购物车增删 结算 查看 清空的功能)

  1. 私有成员变量 car:一个 HashMap 对象,用于存储购物车中的商品。其中,键是商品编号,值是 CartCommodity 对象,表示购物车中的商品及其数量。
  2. 方法 add(Commodity item, int quantity):向购物车中添加商品。如果商品已存在,则增加数量;否则,添加新的商品。
  3. 方法 removeProduct(Commodity item, int quantity):从购物车中删除商品。如果商品存在且数量大于要删除的数量,则减少数量;否则,完全删除商品。
  4. 方法 getQty():返回购物车中商品的总数量。
  5. 方法 checkout():结算购物车中所有商品的总价
  6. show() 方法:显示购物车中的所有商品。调用 printCommodity() 方法打印商品信息让用户查看购物车中的商品及其数量。
  7. clearCart() 方法:清空购物车中的所有商品。它调用 HashMap 对象的 clear() 方法来清空购物车让用户清空购物车,重新开始购物。
  8. printCommodity(Commodity commodity, int quantity) 方法:一个私有方法,用于打印商品信息。这个方法为 show() 方法提供了支持,使得 show() 方法能够方便地打印商品信息。

商场类(展示商城商品和商品的查询)

  1. private static List<Commodity> items = new ArrayList<>();:这一行定义了一个静态的列表,用来存储商品(Commodity)对象。
  2. public static List<Commodity> getItems() {...}:这个静态方法返回上述列表,让外部可以获取当前商城中的所有商品。
  3. public static int getItemCount() {...}:这个静态方法返回商品列表的长度,也就是商城中的商品数量。
  4. public void show() {...}:这个方法遍历商品列表,并使用printCommodity()方法打印每个商品的信息。
  5. private void printCommodity(Commodity commodity) {...}:这个私有方法接收一个商品对象,然后按照格式打印出该商品的编号、名称和价格。
  6. public void addProduct(Commodity item) {...}:这个方法接收一个商品对象,将其添加到商品列表中,也就是说,它允许将新的商品添加到商城。
  7. 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;
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以给你提供一个基于面向对象编程的购物程序示例,帮助您理解Python语言的面向对象编程方法。 首先,我们需要创建一个Product类,用于表示商品对象。每个商品对象都有一个名称、价格和库存数量。我们可以使用该类来创建我们的商品对象。 ```python class Product: def __init__(self, name, price, stock): self.name = name self.price = price self.stock = stock def __str__(self): return f"{self.name} - ${self.price} ({self.stock} in stock)" ``` 接下来,我们需要创建一个Cart类,用于表示购物对象。每个购物对象都有一个包含商品对象的列表和一个总价钱。我们可以使用该类来创建我们的购物对象。 ```python class Cart: def __init__(self): self.items = [] self.total_price = 0 def add_item(self, product, quantity): if product.stock < quantity: print(f"Sorry, we only have {product.stock} of {product.name} in stock.") return product.stock -= quantity item_price = product.price * quantity self.items.append((product, quantity, item_price)) self.total_price += item_price def remove_item(self, item): product, quantity, item_price = item product.stock += quantity self.items.remove(item) self.total_price -= item_price def __str__(self): if not self.items: return "Your cart is empty." cart_items = "\n".join([f"{product.name} ({quantity}): ${item_price}" for product, quantity, item_price in self.items]) return f"{cart_items}\nTotal: ${self.total_price}" ``` 最后,我们需要创建一个DataStorage类,用于表示数据存储对象。每个数据存储对象都有一个包含商品对象的列表。我们可以使用该类来创建我们的数据存储对象。 ```python class DataStorage: def __init__(self): self.products = [] def add_product(self, product): self.products.append(product) def get_product_by_name(self, name): for product in self.products: if product.name == name: return product return None def __str__(self): return "\n".join([str(product) for product in self.products]) ``` 有了这些类,我们就可以创建一个简单的程序来测试它们了。 ```python # 创建数据存储对象 data_storage = DataStorage() # 添加商品 data_storage.add_product(Product("apple", 0.99, 10)) data_storage.add_product(Product("banana", 0.49, 5)) data_storage.add_product(Product("orange", 0.79, 8)) # 创建购物对象 cart = Cart() # 添加商品到购物 cart.add_item(data_storage.get_product_by_name("apple"), 2) cart.add_item(data_storage.get_product_by_name("banana"), 1) # 从购物删除商品 cart.remove_item(cart.items[0]) # 打印购物和数据存储对象 print(cart) print(data_storage) ``` 运行这个程序,输出应该如下所示: ``` banana (1): $0.49 Total: $0.49 apple - $0.99 (8 in stock) banana - $0.49 (4 in stock) orange - $0.79 (8 in stock) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值