购物车系统

面向对象设计(购物车)

一、前期调查

以亚马逊商城为例
首先在主界面上有多个种类分布,点击其中一种种类,会显示出该产品类型下所有产品。

点击产品的具体界面,会有产品信息以及产品规格价钱以及加入到购物车中。!

加入到购物车中后会显示两个选项。结账或者显示购物车。购物车中会显示所有商品,显示商品信息,以及商品库存还有价格,以及所选的价格,可以对商品的数量进行改变,对所选的商品进行添加或者删除。可以进行结算价钱。

而关于用户,要先登录,或者是注册。

二、系统功能结构图

三、功能相关类的设计

由前期调查可得到以下相关类的设计:

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.继承与多态

ElectronicEquipmentClothingBook都继承于Commodity类,且在各自的子类定义了各自的规格字符串数组。

ShoppingCommodity继承Commodity类,并且添加了numisChoose以及modeNum属性。

3.接口

dao包中定义了两个dao接口。

MallDao接口用于存储商品数据;

MallDaoListImpl接口为其子接口,用List数组来存储商品数据。

ShoppingCarDao接口用于存储购物车数据;

ShoppingCarDaoList接口为其子接口,用List数组来存储购物车数据。

posted @ 2021-01-16 16:25  偎己  阅读(167)  评论(0编辑  收藏  举报