课时144:综合实战:超市购物车

简介: 本案例旨在运用面向对象编程的概念,模拟小明去超市购物的生活场景。1.场景概述2.代码实现步骤3.代码优缺点分析

课时144:综合实战:超市购物车

 

摘要:本案例旨在运用面向对象编程的概念,模拟小明去超市购物的生活场景。

1.场景概述

2.代码实现步骤

3.代码优缺点分析

 

01.场景概述

 

具体流程为:小明作为客户端,将购买的商品放入购物车,最后到收银台进行统一结账。购物车主要用于存放商品,我们关注商品的名称、价格等信息;收银台的主要功能是对购物车中的商品进行结算。

image.png  

 

02.代码实现步骤

 

2.1定义商品标准

首先,我们需要定义一个商品的标准,用于规范商品的基本属性。以下是示例代码:

interface IGoods {    // 定义商品标准
    public String getName();
    public double getPrice();
}

在这个接口中,我们定义了两个方法getName()getPrice(),分别用于获取商品的名称和价格。

 

2.2定义购物车标准

为了避免类与类之间的强耦合,我们需要定义一个购物车的标准。购物车应具备添加商品、删除商品以及返回所有商品信息的功能。以下是示例代码:

interface IShopCar {    // 定义购物车
    public void add (IGoods goods);    //添加商品信息
    public void delete (IGoods goods);    // 删除商品
public Object[ ] getAll() ;    // 获得购物车中的全部商品信息
}

 

2.3定义一个购物车的实现类

接下来,我们需要实现购物车接口,创建一个具体的购物车类。这里我们使用链表来存储商品信息,以避免数组内容频繁修改带来的麻烦。以下是示例代码:

class ShopCar implements IShopCar {   // 定义购物车
    private ILink<IGoods> Allgoodses = new LinkeImpl<IGoods>();
    public void add (IGoods goods) {
        this.allGoodses.add(goods)
    }
    public void delete (IGoods goods) {
        this.allGoodses.remove (goods);
    }
    public Object[ ] getAll () {
        return this.allGoodses.toArray();
    }
}

 

2.4定义收银台类

收银台类负责对购物车中的商品进行结算,计算商品的总价和总数量。以下是示例代码:

class Cashier {    // 定义收银台
    private IShopCar shopcar;
    public Cashier(IShopCar shopcar) {
        this.shopcar = shopcar;
    }
public double allPrice() {    // 计算总价
    double all = 0.0;
        Object result = this.shopcar.getAll ();
        for (Object obj : result) {
                IGoods goods = (IGoods) obj;
                all += goods.getPrice();
            }
            return all ;
        }
    public int allCount() {    // 商品数量
        return this.shopcar.getAll ().length;
    }
}

 

2.5定义具体商品类

我们定义两个具体的商品类:图书类和背包类,它们都需要实现IGoods接口。同时,为了能够正确删除商品,我们需要重写equals()方法。以下是图书类的示例代码:

class Book implements IGoods {    // 定义图书
    private String name;
    private double price;
    public Book(String name, double price) {
        this.name = name;
        this.price = price;
    }
    public String getName() {
        return this.name;
    }
    public double getPrice() {
        return this.price;
    }
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (this == obj) {
            return true;
        }
        if (!(obj instanceof Book)) {
           return fales ;
        Book book = (Book) obj;
        return this.name.equals(book.name) && this.price == book.price;
    }
Public String toString() {
    return "【图书信息】名称:" + this.name + "、价格" + this.price;
    }
}
class Bag implements IGoods {    // 定义背包
    private String name;
    private double price;
    public Bag(String name, double price) {
        this.name = name;
        this.price = price;
    }
    public String getName() {
        return this.name;
    }
    public double getPrice() {
        return this.price;
    }
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (this == obj) {
            return true;
        }
        if (!(obj instanceof Bag)) {
           return fales ;
        Bag bag = (Bag) obj;
        return this.name.equals(bag.name) && this.price == bag.price;
    }
Public String toString() {
    return "【背包信息】名称:" + this.name + "、价格" + this.price;
    }
}

 

2.6代码测试

最后,我们编写测试代码,模拟小明购物和结账的过程。以下是示例代码:

public class JavaDemo {
    public static void main(String[] args) {
        IShopCar car = new ShopCar();
        car.addGoods(new Book("Java开发", 79.8));
        car.addGoods(new Book("Oracle开发", 89.8));
        car.addGoods(new Bag("小强背包", 889.8));
        Cashier cas = new Cashier(car);
        System.out.println("总价格:" + cas.allPrice() + "、购买总数量:" + cas.allCount());
    }
}

image.png

 

03.代码优缺点分析

 

3.1优点

通过使用链表存储商品信息,避免了数组内容频繁修改带来的麻烦,提高了代码的灵活性和可维护性。同时,采用面向对象的编程思想,将不同的功能模块封装在不同的类中,降低了代码的耦合度。

 

3.2缺点

当前代码存在一定的局限性,例如不能存储商品的购买数量。若要实现该功能,仅依靠链表是不够的,需要学习更加复杂的数据结构。

相关文章
基于宜搭的“设备报修”实践案例
设备报修是各企业、学校、医院等单位必不可少的应用场景,包括设备管理、用户报修、报修单管理、派单管理、维修管理等。那么,如何利用宜搭+钉钉实现高效的设备报修管理呢?
基于宜搭的“设备报修”实践案例
基于宜搭的“企业报销流程”实践案例
报销是一个企业的典型场景,本案例着重讲述一个典型的财务报销流程的搭建,已介绍宜搭流程相关的核心功能。报销由员工发起申请,填写报销项以及对应的详情信息,发起审批流程。审批流程计划设置为:当前提交人主管,审批人所在部门对应的财务接口人,财务总监(如果金额大于10000元,则需要加入该角色)
基于宜搭的“企业报销流程”实践案例
|
算法
数据结构之购物车系统(链表和栈)
本文介绍了基于链表和栈的购物车系统的设计与实现。该系统通过命令行界面提供商品管理、购物车查看、结算等功能,支持用户便捷地管理购物清单。核心代码定义了商品、购物车商品节点和购物车的数据结构,并实现了添加、删除商品、查看购物车内容及结算等操作。算法分析显示,系统在处理小规模购物车时表现良好,但在大规模购物车操作下可能存在性能瓶颈。
373 0
|
11月前
|
IDE Java 关系型数据库
课时145:Eclipse简介
Eclipse 是现在一个比较大型的开源组织,其主要是以推广 Java 标准以及 IDE 为主。 Eclipse 开发工具
454 0
|
11月前
|
设计模式 Java
课时89:工厂设计模式
课时89介绍工厂设计模式(Factory),涵盖接口的定义与使用、程序结构设计及工厂设计的核心概念。通过实例代码展示如何利用接口实现子类的向上转型,并通过工厂类解耦主类与子类的关系,从而实现更灵活和可扩展的设计。工厂模式使客户端无需关心具体子类的创建过程,仅需通过工厂类获取对象实例,简化了系统的维护和扩展。
157 1
|
安全 测试技术 网络安全
|
监控 数据可视化 安全
如何查找访问 Nginx 的前 10 个 IP?
【5月更文挑战第1天】
825 1
如何查找访问 Nginx 的前 10 个 IP?
|
搜索推荐 安全 Linux
Visual Studio Code 提高效率的快捷方式(下)
Visual Studio Code 是目前最流行、最常用的代码编辑器之一,它是开源的并且可以免费使用。它还提供对多种语言和框架的支持。 ​ 注意,这些 Visual Studio Code 快捷方式取自于 VS Code 官方文档。如果某些快捷方式不起作用,可能是由于编辑器或文件格式中的快捷方式发生了变化,或者安装的扩展影响了该快捷方式。
1427 0
|
缓存 网络架构
计算机网络——数据链路层-可靠传输的实现机制:停止-等待协议SW(确认与否认、超时重传等,信道利用率及相关练习题)
计算机网络——数据链路层-可靠传输的实现机制:停止-等待协议SW(确认与否认、超时重传等,信道利用率及相关练习题)
760 0
|
前端开发 算法 JavaScript
实现注册登录时数据的加密传输(含前后端具体代码)
实现注册登录时数据的加密传输(含前后端具体代码)