Always believe nothing is impossible and just try my best! ------ 谓之谦实。

购物车程序的面向对象设计(Version1.0)

购物车程序的面向对象设计(Version1.0)

0. 初步的目的:

  • 学会使用讲故事的方式找到系统中可能包含的类与属性。
  • 理解封装。
  • 学会结合数据结构的角度去考虑数据的存储问题。(使用了HashMap)

1. 人员分工。

大家一起做的工作有:
前期调查以及类框架设计的考量。

林进源 完成商品总类的设计和子类的设计,负责UML图的绘制,负责Shop类的设计。
骆锟宏 完成ShoppingCart类的书写,完成对商品类和子类的修正,完成MainOperating类,完成博客的撰写。

2. 前期调查。

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

3. 系统功能结构图。

  • 商品首先应该由商城上架载入,并生成唯一的识别的ID码。

该部分属于商城类的部分,由于本次时间等因素的原因,我们暂时把目光聚焦在购物车类上,这个待实现。
在本环节的展示过程中我们对商品上架的部分暂时以在Main类中直接新建对应的商品实例来代替。
goodsID的形式也暂时以直接给定的形式来定义。
在这里插入图片描述

  • 以下是商品被载入购物车的大概构想:
    在这里插入图片描述
  • 以下是购物车类这一块的具体功能的设想图示:
    在这里插入图片描述

4. 系统描述

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

首先, 本系统创建了一个购物车的实例。
其次, 本系统通过在流程控制模块中声明并创建了book,clothing,eProducts,food这四个商品。

  • 在创建book的过程中,传入了该书的唯一ID号该书的名称该书的价格该书的作者,以及该书的出版社
  • 在创建clothing的过程中,传入了该服装的唯一ID号该服装的名称该服装的价格该服装的类型,以及该服装的性别趋向
  • 在创建eProducts的过程中,传入了该电子设备的唯一ID号该电子设备的名称该电子设备的价格该电子设备的品牌,以及该电子设备的定位用途
  • 在创建food的过程中,传入了该食物的唯一ID号该食物的名称该食物的价格该食物的类型
    再然后,我们调用了把商品添加入购物车的方法,依次把book,clothing,eProducts,food这四个商品添加入创建好的购物车中,特别的点是,其中我们重复添加了food
    紧接着,我们调用了购物车的计算总金额的方法
    然后,我们调用了购物车的展示的方法
    再接着,我们调用了购物车的清空的方法
    最后, 我们调用了购物车的清空的方法
    最后的最后, 我们再一次调用了购物车的展示的方法

5. UML类图

类的关键属性与方法、类与类之间的关系。每个类的功能描述。可使用ProcessOn绘制。

  • 图例:
    在这里插入图片描述

  • 商品父类:
    在这里插入图片描述

  • 商品子类:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    商品父类和子类的继承和多态的关系:
    在这里插入图片描述

  • 购物车类:
    在这里插入图片描述

  • 整体的一个初步的功能框架的设定:
    在这里插入图片描述

6. 本系统哪里体现了面向对象的封装性。

可选:哪里体现了继承与多态。

  • 封装性:
    • 封装的设计是为了提高系统的可扩展性、可维护性,将内部一些属性和方法进行隐藏,只能对象自身调用,其它对象无法进行访问和修改,避免对象内部的数据发生错误。
      因此在设计类的时候,我么们采用private、protected修饰属性,例如对象的名字、价格、数量、库存等等,这些属性一旦用public修饰会导致其它对象调用,有可能修改它的具体内容而导致错误。使用protected的原因是我们将父类及其子类一同放入同一包中,在调用子类的toString时需要调用到父类的一些属性达到目的。所以private和protected便可实现封装这一特点。
  • 继承和多态:
    本次大作业的继承我们是写了一块商品总类,它有所有商品的共性:名字、价格、数量、库存、编号。之后我们细分,将商品分为书本、服装、电子产品、食品,它们继承了商品总类却有自己的独特属性,大大减少了我们的代码量。
    多态方面我们在导入商品时构建对象,是以父类商品类去实例化的,但在具体运行过程中它们是以子类对应的种类进行对象的实例化,例如: 在这里插入图片描述

7. 项目包结构与关键代码。

7.1 项目的包结构

(为什么要这样设计包结构)

在这里插入图片描述
基于我们前期对现在已有购物网站的调查得出从后端功能实现角度有两条主要的主线:

  • 其一是商品应该首先是载入到商城中由载入商城的过程中产生一个唯一的代表该商品的唯一的ID号,这个过程是在供给端上架了可以供用户去选择和购买的商品。

  • 其二是当商品已经上架到商城后,在购买端,我们用户根据在商城中对商品信息的了解,最后做出选择把商品加入我们自己的购物车,作为可能购买的商品。

  • 以这两条为主线展开我们对这个购物车大作业的设计。而又由于部分时间的因素,我们暂时不进行商城这个包的代码的撰写和设计,我们优先把焦点集中到购物车类的撰写和方便对购物车类的功能的测试上,我们在体现出我们掌握了继承和多态的知识的前提下,简略地设计了几个具体的子类,以在时间不足的情况下,体现出我们对继承和多态这一知识的掌握。

  • 之所以商品要独立成一个包是考虑到拓展性上,我们觉得商品的子类在实际情况下是可以进行无限地拓展地,所以独立设计一个包会更加合适。

  • 另外,购物车类要独立设计成一个类的考虑有两点,第一点是购物车的很多功能是自成一体的,所以出于独立性的考虑要独立撰写一个包;第二点是,考虑到拓展性上,其实购物车类会是用户类的一个子类,购物车构成一个用户的功能之一。

  • 最后,Main类其实是在前端的操作框架没有实现之前,用来测试整个程序的具体功能的一个测试包,后续加入操作界面后,这个Main类就会被具体代替。

7.2 主要功能

(如网购物车添加、删除商品)的流程图与关键代码。

  • 购物车类这一块的具体功能的设想
    在这里插入图片描述
package shoppingCar;

import java.util.HashMap;//引入哈希表作为购物车的数据结构基础。
import java.math.BigDecimal;//用来表示大数。
import product.*;//引用product包

public class shoppingCar {
	private BigDecimal totalPrice = BigDecimal.valueOf(0.0);
	public HashMap<String, Commodity> ShoppingCar = new HashMap<>();

	public void AddIntoSPC(Commodity commodity) {
		if (!ShoppingCar.containsKey(commodity.getGoodsID()))// 若商品不存在
		{
			ShoppingCar.put(commodity.getGoodsID(), commodity);
		}
		commodity.setNumb(commodity.getNumb() + 1);// 商品数量加一
	}

	public void GetTotalPrice() {
		for (Commodity commodity : ShoppingCar.values()) {
			totalPrice = totalPrice.add(commodity.getPrice().multiply(BigDecimal.valueOf(commodity.getNumb())));
		}
		System.out.println("The total price is:" + totalPrice);
	}

	public void ShowSPC() {//展示购物车
		if (ShoppingCar.isEmpty()) {
			System.out.println();
			System.out.println("---------------------------------------------------------------------------");
			System.out.println("您的购物车当前为空~");
			System.out.println("---------------------------------------------------------------------------");
			System.out.println();
		} else {
			int i = 1;
			System.out.println();
			System.out.println("---------------------------------------------------------------------------");
			for (Commodity commodity : ShoppingCar.values()) {
				System.out.println("NO." + i + " " + commodity.toString());
				i++;
			}
			System.out.println("---------------------------------------------------------------------------");
			System.out.println();
		}

	}

	public void ClearSPC() {
		ShoppingCar.clear();
		System.out.println("———清空购物车完毕!———");
	}
}
  • 考虑到后续对商品需要经常性地做增,删,改等的操作,而这些操作的前提都是要先实现快速的查找,所以我第一步我想到的就是使用hashmap的框架,因为在数据结构的考虑上,我们知道哈希表的查找效率在O(1)。
  • 代码功能实现的展示:
    在这里插入图片描述

7.3 特点

  • 在整个程序设计的过程中有一个我想提出来的我们考虑的一个比较好的点子是,在对价格这一块的处理上,我们考虑到更多时候,价格是针对浮点数进行操作,而double这类数据类型是有浮点误差的缺点的,所以在价格的数据类型上我们细致地选择了:
    在这里插入图片描述
posted @ 2021-10-22 08:10  嘟嘟勒个嘟  阅读(177)  评论(0编辑  收藏  举报