购物车系统
面向对象设计(购物车)
一、前期调查
以亚马逊商城为例
首先在主界面上有多个种类分布,点击其中一种种类,会显示出该产品类型下所有产品。
点击产品的具体界面,会有产品信息以及产品规格价钱以及加入到购物车中。!
加入到购物车中后会显示两个选项。结账或者显示购物车。购物车中会显示所有商品,显示商品信息,以及商品库存还有价格,以及所选的价格,可以对商品的数量进行改变,对所选的商品进行添加或者删除。可以进行结算价钱。
而关于用户,要先登录,或者是注册。
二、系统功能结构图
三、功能相关类的设计
由前期调查可得到以下相关类的设计:
1.购物车类
属性:结算价钱、商品数组(其中因为结算需要,商品继承了数量变量、与判断结算变量)以及所归属的用户序号、判断是否有被选中的变量和规格序号。
方法:计算价钱(库存不够提醒)、将某物品添加或移除商品数组、将第几个的商品数量变为几、选中商品进行结算。
2.商品类
属性:价格、信息、库存、增加数组种类序号(便于初始化循环时)。
方法:显示所有属性。
子类:
电子设备:属性增加容量。
衣服:属性增加尺码。
书籍:属性添加格式。
3.商城类
属性:种类数组、电子设备类数组、衣服类数组、书籍类数组。
方法:对电子设备数组、衣服数组、书籍数组进行初始化(改进:使用同一个数组利用String的下标)、输出种类数组、输出电子设备数组、输出衣服类数组、输出书籍类数组、根据商品名称搜索商品、根据种类选择查看商品、将物品放入购物车(判断是否已经在购物车中,如果在则数量加一,不在则放进)、判断用户有无登录。
4.用户
属性:名字、账号、所对应的购物车。
方法:展示所有属性。
四、UML类图
五、包结构与关键代码
1.包结构
商品类、商城类、购物车类为工具类。
主实现函数与用户类为实现类。
2.关键代码
1.dao包
MallDao
类:
package dao;
import util.Commodity;
public interface MallDao {
public boolean writeCommodity(Commodity commodity);
public Commodity readCommodity(String name);
public void diplayAllCommodity();
}
MallDaoListImpl
类:
package dao;
import java.util.ArrayList;
import java.util.List;
import util.Commodity;
public class MallDaoListImpl implements MallDao {
private List<Commodity> commoditys = new ArrayList<Commodity>();
@Override
public boolean writeCommodity(Commodity commodity) {
commoditys.add(commodity);
return false;
}
@Override
public Commodity readCommodity(String name) {
Commodity temp = null;
for (Commodity e : commoditys) {
if (e.getName().equals(name)) {
temp = e;
}
}
return temp;
}
@Override
public void diplayAllCommodity() {
for (Commodity e : commoditys) {
if (e != null)
System.out.println(e.getName());
System.out.println("所对应的价格为" + e.getPrice());
System.out.println("所对应的库存为" + e.getInventory());
}
}
}
2.util包
Commodity
类:
package util;
public class Commodity {
private double[] price = new double[1000];// 价格数组
private String name = null;
private int[] inventory;// 商品的库存,数组对应每个规格
protected int num;// 数组序号,用于区别不同的种类
public double[] getPrice() {
return price;
}
public void setPrice(double[] price) {
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int[] getInventory() {
return inventory;
}
public void setInventory(int[] inventory) {
this.inventory = inventory;
}
}
class ElectronicEquipment extends Commodity {
static int num = 0;// 因为是种类自己的变量,所以设置为static
static String[] capacity = { "16GB", "32GB", "64GB", "128GB" };// 增加容量属性
}
class Clothing extends Commodity {
static String[] size = { "S", "L", "XL", "XXL" };// 增加尺码属性
static int num = 1;
}
class Book extends Commodity {
static String[] mode = { "实体书", "电子版", "有声读物", "CD音频" };
static int num = 2;
}
Mall
类:
package util;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import dao.MallDaoListImpl;
import java.util.ArrayList;
import java.util.Iterator;
public class Mall {
private static String[] kind = { "电子设备", "衣服", "书籍" };// 种类数组
private MallDaoListImpl electronic = new MallDaoListImpl();// 电子设备数组
private MallDaoListImpl cloth = new MallDaoListImpl();// 衣服类数组
private MallDaoListImpl book = new MallDaoListImpl();// 书籍类数组
public static String[] getKind() {
return kind;
}
public static void setKind(String[] kind) {
Mall.kind = kind;
}
public static void setCommodity(MallDaoListImpl commodity, int num) throws FileNotFoundException {// 对电子设备数组进行初始化
String fileName;
fileName = kind[num] + ".txt";
Scanner in = new Scanner(new File(fileName));
while (in.hasNextLine()) {
Commodity com = new Commodity();
String line = in.nextLine();// 读出myfile.txt的下一行
Scanner lineScanner = new Scanner(line);// 为每一行建立一个扫描器
double[] price = new double[4];// 每个规格的价钱
for (int i = 0; i < 4; i++) {
price[i] = lineScanner.nextDouble();
line = lineScanner.next();
}
com.setPrice(price);
line = in.nextLine();
lineScanner = new Scanner(line);
String name = lineScanner.nextLine();// 商品信息
com.setName(name);
line = in.nextLine();
lineScanner = new Scanner(line);
int[] modeNum = new int[4];
for (int i = 0; i < 4; i++) {
modeNum[i] = lineScanner.nextInt();
line = lineScanner.next();
}
com.setInventory(modeNum);
commodity.writeCommodity(com);// 利用接口类的读入方法
}
in.close();
}
public void setMall() throws FileNotFoundException {
int num = ElectronicEquipment.num;// 因为泛型不能继承子类,所以利用数字来区别种类
Mall.setCommodity(electronic, num);
num = Clothing.num;
Mall.setCommodity(book, num);
num = Book.num;
Mall.setCommodity(book, num);
}
public void printElectronic() {// 输出利用接口类的方法
System.out.println("物品所对应的种类有" + ElectronicEquipment.capacity.toString());
electronic.diplayAllCommodity();
}
public void printClothing() {
System.out.println("物品所对应的种类有" + Clothing.size.toString());
cloth.diplayAllCommodity();
}
public void printBook() {
System.out.println("物品所对应的种类有" + Book.mode.toString());
book.diplayAllCommodity();
}
public void printKind() {
String[] a = Mall.getKind();
for (int i = 0; i < a.length; i++) {
System.out.println(a[i].toString());
}
}
public Commodity searchCommodity(String name) {// 通过查找商品名字来搜索商品
Commodity commodity = null;
commodity = electronic.readCommodity(name);
if (commodity != null) {
return commodity;
}
commodity = cloth.readCommodity(name);
if (commodity != null) {
return commodity;
}
commodity = book.readCommodity(name);
if (commodity != null) {
return commodity;
}
return commodity;
}
static boolean judgeIsLogin(ShoppingCar shopCar) {// 判断是否用户登录
if (shopCar.getUserNum() == -1)
return false;
else
return true;
}
public void putIntoShoppingCar(Commodity com, ShoppingCar shopCar) {// 将物品添加到购物车中
while (judgeIsLogin(shopCar)) {
ArrayList<ShoppingCommodity> a = shopCar.commoList;
Iterator<ShoppingCommodity> b = a.iterator();
int n = 0;
ShoppingCommodity c = null;
while (b.hasNext()) {
c = b.next();
if (c.getName().equals(com.getName())) {// 判断是否已在购物车中
break;
} else
n++;
}
if (n < a.size()) {// 说明商品有在购物车中
int num = c.getNum();
num++;
c.setNum(num);
a.remove(n);
a.add(n, c);
} else
a.add((ShoppingCommodity) com);
}
}
}
ShoppingCar
类:
package util;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
class ShoppingCommodity extends Commodity {
private int num;// 所在购物车中的商品数量
private int isChoose;// 结算商品是判断有无被选中进行结算
private int modeNum;// 规格序号
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getModeNum() {
return modeNum;
}
public void setModeNum(int modeNum) {
this.modeNum = modeNum;
}
public int getIsChoose() {
return isChoose;
}
public void setIsChoose(int isChoose) {
this.isChoose = isChoose;
}
}
public class ShoppingCar {
private int userNum = -1;// 所属的用户序号
private double price = 0;
public ArrayList<ShoppingCommodity> commoList = new ArrayList<ShoppingCommodity>();
public int getUserNum() {
return userNum;
}
public void setUserNum(int userNum) {
this.userNum = userNum;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public ArrayList<ShoppingCommodity> getCommoList() {
return commoList;
}
public void setCommoList(ArrayList<ShoppingCommodity> commoList) {
this.commoList = commoList;
}
public void changeNum(int num, String name) {// 根据商品名字修改商品数量
Iterator<ShoppingCommodity> a = commoList.listIterator();
while (a.hasNext()) {
ShoppingCommodity e = a.next();
if (e.getName().equals(name)) {
commoList.remove(e);
if (num == 0) {
break;
} else {
e.setNum(num);
commoList.add(e);
}
}
}
}
public void removeCommodity(String name) {// 根据商品名称删除商品
Iterator<ShoppingCommodity> a = commoList.listIterator();
while (a.hasNext()) {
ShoppingCommodity e = a.next();
if (e.getName().equals(name)) {
commoList.remove(e);
}
}
}
public void selectCommodity() {// 选择购物出中需要结算的
Iterator<ShoppingCommodity> a = commoList.listIterator();
while (a.hasNext()) {
ShoppingCommodity e = a.next();
System.out.println(e.getName());
System.out.println("是否选择去结算");
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
if (str.equals("是")) {
System.out.println("请输入你选择的商品规格");// 输入所购买的商品规格
e.setModeNum(sc.nextInt());
int[] b = e.getInventory();
if (b[e.getModeNum()] < e.getNum()) {
System.out.println("库存不够,无法购买");// 根据库存来判断是否能进行购买
continue;
} else {
commoList.remove(e);
e.setIsChoose(1);
commoList.add(e);
}
}
}
}
public double payPrice() {
Iterator<ShoppingCommodity> a = commoList.listIterator();
while (a.hasNext()) {
ShoppingCommodity e = a.next();
if (e.getIsChoose() == 1) {
double[] b = e.getPrice();// 保存价格数组
int c = e.getModeNum();// 保存规格序号
int d = e.getNum();// 保存要买的商品数量
price = price + b[c] * d;
}
}
return price;
}
}
六、封装、继承、多态与接口
1.封装
Mall
类中的setCommodity
方法:将所指定的文件中的数据输入到商品数组中。
2.继承与多态
ElectronicEquipment
、Clothing
与Book
都继承于Commodity
类,且在各自的子类定义了各自的规格字符串数组。
ShoppingCommodity
继承Commodity
类,并且添加了num
、isChoose
以及modeNum
属性。
3.接口
dao包中定义了两个dao接口。
MallDao
接口用于存储商品数据;
MallDaoListImpl
接口为其子接口,用List数组来存储商品数据。
ShoppingCarDao
接口用于存储购物车数据;
ShoppingCarDaoList
接口为其子接口,用List数组来存储购物车数据。