Java面向对象课程设计——购物车
小组成员:余景胜、刘格铭、陈国雄、达瓦次仁
一、前期调查
流程
客人(Buyer)先在商城(Mall)中浏览商品(Commidity),将浏览的商品加入购物车(Shopping Cart),最后通过购物车生成订单(Order),在购买时填写顾客地址信息(address),购买结束。
二、购物车
1.图表
业务流程图
功能结构图
UML图
2.包
包结构
3.类
(代码中均省略了自动生成的getter/setter)
Mall
代码
public class Mall {// 商场 private List<Commodity> commodities = new ArrayList<>(); { // 初始化商品 commodities.add(new Commodity("耐克 AJ1 GS", 3999, 1, "shoes")); commodities.add(new Commodity("OnePlus 6", 3599, 2, "phone")); commodities.add(new Commodity("苹果iPhone XS", 8699, 3, "phone")); commodities.add(new Commodity("联想拯救者Y7000", 7499, 4, "computer")); commodities.add(new Commodity("森马T恤", 65.9, 5, "cloth")); commodities.add(new Commodity("匡威男式板鞋", 419.0, 6, "shoes")); commodities.add(new Commodity("七匹狼休闲裤", 278, 7, "cloth")); commodities.add(new Commodity("黑人牙膏", 13.9, 8, "dailylife")); commodities.add(new Commodity("黑人牙刷", 15.9, 9, "dailylife")); commodities.add(new Commodity("戴尔灵越367", 5099, 10, "computer")); } public List<Commodity> showGoods() {// 展示商品 return this.commodities; } public Commodity searchGoodById(int id) {// 按编号搜索商品 int i = 0, flag = 1; for (i = 0; i < commodities.size(); i++) { if (commodities.get(i).getId() == (id)) { return commodities.get(i); } } if (flag == 1) System.out.println("对不起,您要找的商品我们没有"); return null; } public List<Commodity> searchGoodsByType(String type) {// 按类型搜索商品 int i = 0; List<Commodity> list = new ArrayList<>(); for (i = 0; i < commodities.size(); i++) { if (commodities.get(i).getType().equals(type)) { list.add(commodities.get(i)); } } return list; } }
功能:
- 默认开始对商城进行初始化
- 展示商城所有商品
- 输入编号搜索商品,并将商品信息输出;反之则输出无法找到相应商品
- 输入类型搜索商品,将该类商品全部输出;不存在则直接输出不存在
Commodity
代码
public class Commodity {//商品 private String name; private double price; private Integer id; private String type; public Commodity(String name, double price, Integer id, String type) { this.name = name; this.price = price; this.id = id; this.type = type; } public Commodity() { }
功能:
- 存储商品信息 :姓名 价格 编号 种类
ShoppingCart
代码
方法部分
public class ShoppingCart { private List<ItemEntry> itemList = new ArrayList<>(); public void addToCart(Commodity e) { int index = findById(e.getId()); if (index == -1) { itemList.add(new ItemEntry(e)); } else { itemList.get(index).increase(); } } public List<ItemEntry> getItemList() { return itemList; } public List<ItemEntry> emptyCart(){ itemList.clear(); return itemList; } public List<ItemEntry> seeMyCart() { return itemList; } public Order putInOrder() { Order ord = new Order(); ord.setOrderList(itemList); return ord; } public boolean remove(Integer id) { if (id == null) return false; int index = findById(id); if (index == -1) {// 未找到 return false; } else { ItemEntry entry = this.itemList.get(index); if (entry.getPiece() <= 1) { this.itemList.remove(index); } else { entry.decrease(); } } return true; } private int findById(Integer id) { int index = -1; if (itemList.size() > 0) { for (int i = 0; i < itemList.size(); i++) { if (itemList.get(i).getItem().getId() == id) index = i; } } return index; }
ShoppingCart的内部类ItemEntry
public class ItemEntry { Commodity item; Integer piece; public ItemEntry(Commodity item) { this.item = item; piece = 1; } public void increase() { piece++; } public void decrease() { piece--; } /*......*/ public String toString() { return "ItemEntry [item=" + item + ", piece=" + piece + "]"; } } }
功能:
- 添加商品到购物车:若不存在则添加新商品;若存在则在已有的数量上加一
- 查看购物车商品清单
- 清空购物车
- 查看商品列表
- 生成订单:将购物车中的商品穿给订单类
- 按编号删除商品:若商品存在且数量不为一,则数量减一;若数量为一,则商品删除;若商品不存在则返回false
- 找到输入编号的商品:若存在则返回其在List中的位置,否则返回-1;
内置类ItemEntry
- 存储购物车中条目:商品 数量
- 初始化新加入的商品,数量默认为一
- 操作商品数量
- 输出条目信息
Order
代码
public class Order { private Buyer buyer; private List<ItemEntry>orderList=new ArrayList<>() ; private String orderId; public List<ItemEntry> checkOrder() { if(orderList.size()>0) { return orderList; }else { return null; } } public String getOrderId() { return orderId; } public void setOrderId() { int x=new Random().nextInt(100); this.orderId = " "+x; } /*......*/
功能:
- 检查购物车中是否存在商品
- 生成订单信息
Buyer
代码
public class Buyer { private String name; private int zip; private String tel; private String email; private Address address; public Buyer allImformation(Buyer you) { return you; } /*......*/
功能:
- 存储买家相关信息
Address
代码
public class Address { private String city; private String street; private String location; /*.......*/
功能:
- 存储地址信息
4.实现思路
简易购物车系统具体功能设计:
1、商城功能:包括所有上架商品展示、按类型查找商品和被选定商品详细信息展示。
2、购物车功能:包括选定商品到购物车,查看、清空购物车以及从购物车删除某商品。
3、订单功能:包括获取购物车的信息以及获取购买者的一些联系信息,最后就是结账了。
简易购物车系统的面向对象(这里只体现在封装上):
众所周知,JAVA是面向对象的编程语言,所以我们在设计类以及方法的时候不能只看重功能可行性,更重要的是要符合逻辑。举个例子,对于订单与购物车,如果不考虑符不符合逻辑,让订单直接继承自购物车的话就很简单,可以省去不少代码,但是考虑到类的继承必须要符合“is-a”的逻辑关系,而显然订单并不是一个购物车,因此这个设计并不符合逻辑,仅仅是实现了功能而已。因此,在设计的时候,订单并不能继承自购物车。
以下几点为设计的几个小原则:
- 方法与类必须有内在联系
比如查询商品的方法就是在商城类定义,而不能在商品类。这样才符合设计的逻辑,也方便别人想查找某个方法的时候能够一下就想到在哪里。
- 有关信息的输入输出,全在菜单(即主函数)内实现;业务类方法只返回对象
其一,这样输入输出都在菜单进行,而其他为业务的方法则在所对应的类里面,使得方法看着简洁美观且逻辑性强。其二,这样在菜单获取信息的时候只需知道该业务类方法返回的对象然后被可信对象操作即可,不用知道其他,这样就能对外部环境隐藏该方法的内部工作方式,提高了代码的模块性,且防止了对象之间不良的相互影响,实现对方法的封装。
三、git链接
https://gitee.com/WoMingZiShiGeZiBuXinNiShu/OnlineShop/tree/master/ShoppingSystem