Java-购物车实践与应用

简介: Java-购物车实践与应用

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


1.人员分工:


姓名 任务
陈丹宇 编码规范、面向对象设计、功能设计
韦早辉 前期调查、博客制作


2.前期调查:


2.1登录京东我们可以在搜索栏中搜索先要购买的商品名称


ecd90361f5f32599f2d29ef15623c12e.jpg

2.2搜索后可以看见商品的名称,价格,然后将心仪的一定数量的商品添加入购物车


f0a24f3c4587d5b8025c7dde21394dcf.jpg


2.3在购物车我们可以看见商品的总价,删除一定数量的商品,或者一键清空购物车,最后进行结账


82b469c9393e2f44dce309baa370fb3e.jpg


3.系统系统描述:


登录京东,然后在搜索栏中输入商品名称,搜索后可以看见商品的编号,名称,价格,然后将心仪的一定数量的商品添加至购物车,在购物车中可见看见所展示的商品,可以对一定数量的商品进行删除或者清空购物车,最后得出商品的总价后结账


4.系统结构图:


5bfc9c1fe10936545395240eda402f0e.jpg

5.UML类图:


35912cda27e551d85712707f5eee1204.png


6.体现了面向对象的封装性:


在同一个包内调用Class文件


7.程序的实现


7.1浏览商品及功能界面

4d25a33a5fea95d53818863a66cf0b4e.png

7.2实现向购物车内添加商品

447dcac7e466e032a95d48d1c7fada5c.png

7.3删除购物车内的物品


9da521986d7d92b647b09b5bfe219055.png


7.4查看购物车内的商品

fc3b2cc4e4bdc4047373deb1b30599b8.png


7.5实现结账功能

2cbfc1e38d8d705fd84811748ec6b7fc.png


7.6清空购物车


f2204632d21eae6626584311f47e8332.png

8.项目包结构与关键代码:


8.1Main类

package Shoppingcart;
import java.util.Scanner;
public class Main {
 public static void main(String[] args){
      Product[] products = new Product[4];
        products[0] = new Product(100,"华为P50",4988);
        products[1] = new Product(200,"小米11",3699);
        products[2] = new Product(300,"红魔6s",4899);
        products[3] = new Product(400,"苹果13",6799);
        Scanner scanner = new Scanner(System.in);
        System.out.println("是否开始购物?(Y/N)");
        String ans = scanner.nextLine();
        if (ans.equals("Y") || ans.equals("y")){
            ShoppingCart shoppingCart = new ShoppingCart();
            System.out.println("\t\t华强手机旗舰店");
            Menu.show();
            while (true){
              System.out.println("===========================================");
                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("===========================================");
                int choose = scanner.nextInt();
                if (choose == 1){
                    System.out.println("请输入您要添加的商品的编号");
                    int productNum = scanner.nextInt();
                    Product p =  getProduct(productNum,products);
                    if (p != null){
                       System.out.println("请输入要该类商品的添加数量");
                       int addCount = scanner.nextInt();
                       shoppingCart.addProducts(p,addCount);
                   }else {
                       System.out.println("输入的商品编号有误!");
                   }
                }
                if (choose == 2){
                    System.out.println("请输入您要删除的商品的编号");
                    int productNum = scanner.nextInt();
                    Product p =  getProduct(productNum,products);
                    if (p != null){
                        System.out.println("请输入要该类商品的删除数量");
                        int delCount = scanner.nextInt();
                        shoppingCart.removeProducts(p,delCount);
                    }else {
                        System.out.println("输入的商品编号有误!");
                    }
                }
                if (choose == 3){
                    shoppingCart.clearShoppingCar();
                }if (choose == 4){
                    shoppingCart.lookCart();
                }
                if (choose == 5){
                    shoppingCart.checkOut();
                }if (choose == 6){
                    System.out.println("感谢您的惠顾,祝您生活愉快!");
                    break;
                }
            }
        }
        else {
            System.exit(0);
        }
 }
    //传入一个商品编号 返回一个商品
    public static Product getProduct(int num,Product[] products){
        for (int i=0 ;i<products.length;i++){
            int id = products[i].getId();
            if (id == num){
                return products[i];
            }
        }
        return null;
    }
}

8.2Menu类

package Shoppingcart;
public class  Menu{
     public static void show(){
        System.out.println("===========================================");
          Product[] products = new Product[4];
          products[0] = new Product(100,"华为P50",4988);
          products[1] = new Product(200,"小米11",3699);
          products[2] = new Product(300,"红魔6s",4899);
          products[3] = new Product(400,"苹果13",6799);
          System.out.println(products[0]);
          System.out.println(products[1]);
          System.out.println(products[2]);
          System.out.println(products[3]);
          System.out.println("===========================================");
      }
}

8.3Product类

package Shoppingcart;
public class Product{
    private Integer id;
    private String name;
    private double price;
    public Product(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 String toString() {
        System.out.println("编号"+"\t"+"商品名"+"\t   "+"售价");
        return id+"\t"+name+"\t "+price;
//            
//                " 编号:" + id +
//                " 名称:" + name  +
//                " 单价:" + price ;
    }
}

8.4ShoppingCart类

package Shoppingcart;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class ShoppingCart  {
    private Map<Product,Integer> cars;
    private double totalPrice;
    public ShoppingCart(){
        cars = new HashMap<>();
    }
    //对外提供添加多个一类商品的方法
    public void addProducts(Product p,Integer num){
        if (num<=0){
            System.out.println("商品数量不能小于1!");
            return;
        }
        if (cars.containsKey(p)){
            //说明购物车已经包含此商品了  这时需要累加 商品的数量
            int productcount_before = cars.get(p);
            int productcount_after = productcount_before + num;
            cars.put(p,productcount_after);
            System.out.println("添加商品成功!");
        }else {
            //程序执行到这里说明购物车中没有此商品 则添加
            cars.put(p,num);
            System.out.println("添加商品成功!");
        }
        double price = (p.getPrice())*num;
        totalPrice = totalPrice + price;
    }
    //提供添加一个商品的方法
    public void addProducts(Product product){
        addProducts(product,1);
        System.out.println("添加一个商品成功!");
    }
    //删除一类商品(指定数量)
    public void removeProducts(Product product,Integer deletenum){
        if (!cars.containsKey(product)){
            System.out.println("您要删除的商品不存在!");
            return;
        }
        //获取这个商品此时的数量 要删除的数量不能大于这个数量
        int productNum = cars.get(product);
        if (deletenum>productNum){
            System.out.println("删除的商品数量不能大于已有的数量!");
            return;
        }
        //更新key,重复 value覆盖
        int afterDelete = productNum - deletenum;
        //判断删除的数量是否的存在的数量相等 如果相等 则应连同商品删除
        if (productNum == deletenum){
            cars.remove(product);
            System.out.println("删除商品成功!");
        }else {
            cars.put(product,afterDelete);
            System.out.println("删除商品成功!");
        }
        //删去对应的价格
        double price = (product.getPrice()) * deletenum;
        totalPrice = totalPrice - price;
    }
    //清空购物车
    public void clearShoppingCar(){
        if (cars.size()<=0){
            System.out.println("购物车还没有商品"+"\n");
            return;
        }
        cars.clear();
        totalPrice = 0.0;
        System.out.println("清空购物车成功!");
    }
    //结账
    public void checkOut(){
        if (cars.size()<=0){
            System.out.println("购物车还没有商品"+"\n");
            return;
        }else {
            System.out.println("\t\t购物详单"+"\n");
            System.out.println("==============================================================\n");
            for (Map.Entry<Product,Integer> me : cars.entrySet()){
                int num = me.getValue();
                Product product = me.getKey();
                int pid = product.getId();
                String pname = product.getName();
                double price = product.getPrice();
                System.out.println("商品编号:"+pid+"  商品名称:"+pname+"  商品单价:"+price+"  商品数量:"+num+"\n");
            }
            System.out.println("==============================================================\n");
            System.out.println("总价:"+totalPrice+"\n");
            System.out.println("祝您购物愉快,欢迎下次光临!");
            clearShoppingCar();
        }
    }
    //查看购物车
    public void lookCart(){
        if (cars.size()<=0){
            System.out.println("购物车里没有商品"+"\n");
            return;
        }else {
            System.out.println("您的购物车"+"\n\n");
            for (Map.Entry<Product,Integer> me : cars.entrySet()){
                int num = me.getValue();
                Product product = me.getKey();
                int pid = product.getId();
                String pname = product.getName();
                double price = product.getPrice();
                System.out.println("商品编号:"+pid+"  商品名称:"+pname+"  商品单价:"+price+"  商品数量:"+num+"\n");
            }
        }
    }
}


总结


购物车的应用是我和小伙伴写的第一个程序,因此大部分是在模仿,代码层面第一次接触hashMap类,其中的大部分方法还是容易忘记,以及在Object中的默认方法是我们今后学习需要特别注意的地方。


最后感谢DanceDonkey博主的代码参考。

相关文章
|
27天前
|
存储 缓存 安全
Java内存模型深度解析:从理论到实践####
【10月更文挑战第21天】 本文深入探讨了Java内存模型(JMM)的核心概念与底层机制,通过剖析其设计原理、内存可见性问题及其解决方案,结合具体代码示例,帮助读者构建对JMM的全面理解。不同于传统的摘要概述,我们将直接以故事化手法引入,让读者在轻松的情境中领略JMM的精髓。 ####
33 6
|
28天前
|
人工智能 安全 Java
Java和Python在企业中的应用情况
Java和Python在企业中的应用情况
50 7
|
21天前
|
存储 监控 小程序
Java中的线程池优化实践####
本文深入探讨了Java中线程池的工作原理,分析了常见的线程池类型及其适用场景,并通过实际案例展示了如何根据应用需求进行线程池的优化配置。文章首先介绍了线程池的基本概念和核心参数,随后详细阐述了几种常见的线程池实现(如FixedThreadPool、CachedThreadPool、ScheduledThreadPool等)的特点及使用场景。接着,通过一个电商系统订单处理的实际案例,分析了线程池参数设置不当导致的性能问题,并提出了相应的优化策略。最终,总结了线程池优化的最佳实践,旨在帮助开发者更好地利用Java线程池提升应用性能和稳定性。 ####
|
20天前
|
安全 Java 数据库连接
Java中的异常处理:理解与实践
在Java的世界里,异常处理是维护代码健壮性的守门人。本文将带你深入理解Java的异常机制,通过直观的例子展示如何优雅地处理错误和异常。我们将从基本的try-catch结构出发,探索更复杂的finally块、自定义异常类以及throw关键字的使用。文章旨在通过深入浅出的方式,帮助你构建一个更加稳定和可靠的应用程序。
30 5
|
23天前
|
缓存 Java 开发者
Java多线程并发编程:同步机制与实践应用
本文深入探讨Java多线程中的同步机制,分析了多线程并发带来的数据不一致等问题,详细介绍了`synchronized`关键字、`ReentrantLock`显式锁及`ReentrantReadWriteLock`读写锁的应用,结合代码示例展示了如何有效解决竞态条件,提升程序性能与稳定性。
88 6
|
20天前
|
安全 Java 程序员
Java内存模型的深入理解与实践
本文旨在深入探讨Java内存模型(JMM)的核心概念,包括原子性、可见性和有序性,并通过实例代码分析这些特性在实际编程中的应用。我们将从理论到实践,逐步揭示JMM在多线程编程中的重要性和复杂性,帮助读者构建更加健壮的并发程序。
|
21天前
|
监控 Java 数据库连接
Java线程管理:守护线程与用户线程的区分与应用
在Java多线程编程中,线程可以分为守护线程(Daemon Thread)和用户线程(User Thread)。这两种线程在行为和用途上有着明显的区别,了解它们的差异对于编写高效、稳定的并发程序至关重要。
28 2
|
23天前
|
安全 Java 开发者
Java中的多线程编程:从基础到实践
本文深入探讨了Java多线程编程的核心概念和实践技巧,旨在帮助读者理解多线程的工作原理,掌握线程的创建、管理和同步机制。通过具体示例和最佳实践,本文展示了如何在Java应用中有效地利用多线程技术,提高程序性能和响应速度。
55 1
|
28天前
|
关系型数据库 MySQL Java
MySQL索引优化与Java应用实践
【11月更文挑战第25天】在大数据量和高并发的业务场景下,MySQL数据库的索引优化是提升查询性能的关键。本文将深入探讨MySQL索引的多种类型、优化策略及其在Java应用中的实践,通过历史背景、业务场景、底层原理的介绍,并结合Java示例代码,帮助Java架构师更好地理解并应用这些技术。
27 2
|
1月前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####