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博主的代码参考。

相关文章
|
28天前
|
Java 编译器 开发者
Java中的this关键字详解:深入理解与应用
本文深入解析了Java中`this`关键字的多种用法
113 9
|
28天前
|
Java 应用服务中间件 API
【潜意识Java】javaee中的SpringBoot在Java 开发中的应用与详细分析
本文介绍了 Spring Boot 的核心概念和使用场景,并通过一个实战项目演示了如何构建一个简单的 RESTful API。
38 5
|
28天前
|
人工智能 自然语言处理 搜索推荐
【潜意识Java】了解并详细分析Java与AIGC的结合应用和使用方式
本文介绍了如何将Java与AIGC(人工智能生成内容)技术结合,实现智能文本生成。
53 5
|
28天前
|
SQL Java 数据库连接
【潜意识Java】深入理解MyBatis,从基础到高级的深度细节应用
本文详细介绍了MyBatis,一个轻量级的Java持久化框架。内容涵盖MyBatis的基本概念、配置与环境搭建、基础操作(如创建实体类、Mapper接口及映射文件)以及CRUD操作的实现。此外,还深入探讨了高级特性,包括动态SQL和缓存机制。通过代码示例,帮助开发者更好地掌握MyBatis的使用技巧,提升数据库操作效率。总结部分强调了MyBatis的优势及其在实际开发中的应用价值。
32 1
|
1月前
|
Kubernetes Java 持续交付
小团队 CI/CD 实践:无需运维,Java Web应用的自动化部署
本文介绍如何使用GitHub Actions和阿里云Kubernetes(ACK)实现Java Web应用的自动化部署。通过CI/CD流程,开发人员无需手动处理复杂的运维任务,从而提高效率并减少错误。文中详细讲解了Docker与Kubernetes的概念,并演示了从创建Kubernetes集群、配置容器镜像服务到设置GitHub仓库Secrets及编写GitHub Actions工作流的具体步骤。最终实现了代码提交后自动构建、推送镜像并部署到Kubernetes集群的功能。整个过程不仅简化了部署流程,还确保了应用在不同环境中的稳定运行。
70 9
|
2月前
|
安全 算法 Java
Java CAS原理和应用场景大揭秘:你掌握了吗?
CAS(Compare and Swap)是一种乐观锁机制,通过硬件指令实现原子操作,确保多线程环境下对共享变量的安全访问。它避免了传统互斥锁的性能开销和线程阻塞问题。CAS操作包含三个步骤:获取期望值、比较当前值与期望值是否相等、若相等则更新为新值。CAS广泛应用于高并发场景,如数据库事务、分布式锁、无锁数据结构等,但需注意ABA问题。Java中常用`java.util.concurrent.atomic`包下的类支持CAS操作。
80 2
|
2月前
|
存储 监控 小程序
Java中的线程池优化实践####
本文深入探讨了Java中线程池的工作原理,分析了常见的线程池类型及其适用场景,并通过实际案例展示了如何根据应用需求进行线程池的优化配置。文章首先介绍了线程池的基本概念和核心参数,随后详细阐述了几种常见的线程池实现(如FixedThreadPool、CachedThreadPool、ScheduledThreadPool等)的特点及使用场景。接着,通过一个电商系统订单处理的实际案例,分析了线程池参数设置不当导致的性能问题,并提出了相应的优化策略。最终,总结了线程池优化的最佳实践,旨在帮助开发者更好地利用Java线程池提升应用性能和稳定性。 ####
|
2月前
|
安全 Java 数据库连接
Java中的异常处理:理解与实践
在Java的世界里,异常处理是维护代码健壮性的守门人。本文将带你深入理解Java的异常机制,通过直观的例子展示如何优雅地处理错误和异常。我们将从基本的try-catch结构出发,探索更复杂的finally块、自定义异常类以及throw关键字的使用。文章旨在通过深入浅出的方式,帮助你构建一个更加稳定和可靠的应用程序。
45 5
|
3月前
|
缓存 Java 开发者
Java多线程并发编程:同步机制与实践应用
本文深入探讨Java多线程中的同步机制,分析了多线程并发带来的数据不一致等问题,详细介绍了`synchronized`关键字、`ReentrantLock`显式锁及`ReentrantReadWriteLock`读写锁的应用,结合代码示例展示了如何有效解决竞态条件,提升程序性能与稳定性。
354 6
|
2月前
|
安全 Java 程序员
Java内存模型的深入理解与实践
本文旨在深入探讨Java内存模型(JMM)的核心概念,包括原子性、可见性和有序性,并通过实例代码分析这些特性在实际编程中的应用。我们将从理论到实践,逐步揭示JMM在多线程编程中的重要性和复杂性,帮助读者构建更加健壮的并发程序。