购物车程序的面向对象设计
0. 人员分工
任务 | 姓名 |
---|---|
编码规范、前期调查与功能设计、面向对象设计 | 余智康 |
代码检查,功能矫正,博客制作 | 喻文康 |
1. 前期调查
根据在京东商城的体验和调查,列出个人观点:商品应有对应的全部商品的列表或清单,供顾客挑选
以及记录商品剩余量(即确认是否缺货),购物车用于存放用户选择的所有商品信息,包含商品名称、
数量和价格(单类商品价格和购物车所有商品总价格)等等。
2. 系统功能结构图
3. 系统描述
4. UML类图
5. 项目包结构与关键代码
系统菜单:
package Page;
import java.util.Scanner;
import Item.ItemsList;
import Item.ShopCart;
public class Menu {
public static void begin(ItemsList itemsList, ShopCart cart) {
Scanner sc = new Scanner(System.in);
while(true) {
System.out.println("欢迎使用购物车系统(0.1版)!");
System.out.println("-----1.进入商品选购页面------");
System.out.println("-----2.进入“购物车”页面------");
System.out.println("-----3.退出-----------------");
System.out.print("请输入你的选择(1或2或3): ");
String chose = sc.next();
switch (chose) {
case "1":
SelectPage.shopWindow(itemsList, cart);
break;
case "2":
CartPage.cartWindow(itemsList, cart);
break;
case "3":
sc.close();
System.out.println("欢迎下次再来!");
System.exit(0);
break;
default:
System.out.println("\n输出错了!请输入数字 1 或 2 或 3");
System.out.print("请输入你的选择(1或2或3): ");
break;
}
}
}
}
购物车:
package Item;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ShopCart {
Map<Integer,Integer> shopCart = new HashMap<Integer, Integer>();
List<Integer> itemsShop = new ArrayList<>();
public int getNumber(int id) {
return shopCart.get(id);
}
public int calculatePrice(ItemsList itemsList) {
int sum = 0;
for(int i=0; i<itemsShop.size(); i++) {
int id = itemsShop.get(i);
sum += shopCart.get(id) * itemsList.getPrice(id);
}
return sum;
}
public void putItems(int id, int number, ItemsList itemsList) {
if(itemsShop.contains(id)) { //存在 数量增加
int old = shopCart.get(id);
shopCart.put(id, old+number);
}
else {
itemsShop.add(id);
shopCart.put(id, number);
}
int stock = itemsList.getStoke(id) - number;
itemsList.setStoke(id, stock);
}
//扩展:可以在购物车里面没有东西的时候,输出“购物车是空的,快去选择心仪的物品吧!”之类的。实现进一步的交互
public void showCart(ItemsList itemsList) {
System.out.println(" 商品ID 商品名称 单价 个数");
for(int i=0; i<itemsShop.size(); i++) {
int id = itemsShop.get(i);
System.out.printf("%12d %12s %12s元 %12s个\n", id, itemsList.getName(id), itemsList.getPrice(id), shopCart.get(id));
}
}
}
商品选择功能:
package Page;
import java.util.Scanner;
import Item.Items;
import Item.ItemsList;
import Item.Protect;
import Item.ShopCart;
public class SelectPage {
public static void shopWindow(ItemsList itemsList, ShopCart cart) {
String choose = new String();
Scanner sc = new Scanner(System.in);
System.out.println("正在导入目前已有的商品信息...");
System.out.println("导入完毕!");
//System.out.println("若要输入新的商品信息,请输入 Y ;若不需要录入新的信息,请输入 N。");
//System.out.print("(选N选N,录入的代码还没写0.0)您的选择:");
//choose = sc.next();
choose = "N";
if(choose.equals("Y")) {
System.out.println("输入格式如:悠悠球 15 火力店 2021/10/06");
System.out.println("请开始输入:");
}
Items item = new Items();
choose = "N";
int id, number;
String str = new String();
while(!(choose.equals("Y")||(choose.equals("y")))) {
SelectPage.showItems(itemsList);
System.out.print("购物车(“ 请输入某一件商品的ID ”):");
str = sc.next();
while(!Protect.isLegal(str, 0, item.getCount())) {
System.out.printf("\n抱歉,你输入有误,请输入范围 0 到 %d 的商品数字ID!\n",item.getCount()-1);
System.out.print("购物车(“ 输入某一件商品的ID ”):");
str = sc.next();
//System.out.print(str);
}
id = Integer.parseInt(str);
System.out.println();
System.out.printf("你的选择是%s,请选择想要的数量:",itemsList.getName(id));
str = sc.next();
while(!Protect.isLegal(str, 0, itemsList.getStoke(id))) {
System.out.printf("\n抱歉,你输入有误,请输入范围 0 到 %d 的商品个数!\n",itemsList.getStoke(id));
System.out.printf("你需要多少个%s: ",itemsList.getName(id));
str = sc.next();
}
number = Integer.parseInt(str);
cart.putItems(id, number, itemsList);
System.out.println();
System.out.print("\n若要展示当前购物车内的商品,请输入 Y , 否则输入其它任意键继续购物:");
if((choose = sc.next()).equals("Y") || choose.equals("y"))
cart.showCart(itemsList);
System.out.print("\n输入Y,则停止购物返回主菜单;否则输入任意键继续购物:");
choose = sc.next();
}
System.out.println("\n欢迎下次再使用我们的购物系统!");
//sc.close();
}
public static void showItems(ItemsList itemsList) {
System.out.println("接下来将展示可供选择的商品:");
Items item = new Items();
System.out.println(" 商品ID 商品名称 商品价格 店铺 生产日期 库存");
for(int i=0; i<item.getCount(); i++) {
System.out.printf("%12d %12s %12s元 %12s %16s %12d\n",i ,itemsList.getName(i), itemsList.getPrice(i), itemsList.getStore(i), itemsList.getDateMake(i), itemsList.getStoke(i));
}
System.out.println("来吧!正在进入选购操作,你将可以挑选你喜欢的商品!(注意:输入时请输入商品ID)");
}
}
购物车编辑页面:
package Page;
import java.util.Scanner;
import Item.ItemsList;
import Item.Protect;
import Item.ShopCart;
public class CartPage {
public static void cartWindow(ItemsList itemsList, ShopCart cart) {
Scanner sc = new Scanner(System.in);
String chose = new String();
String str = new String();
String stop = new String();
int id;
cart.showCart(itemsList);
while(true) {
System.out.println("以下是对购物车商品的操作:");
System.out.println("----1.输入 D 进行删除购物车商品操作");
System.out.println("----2.输入 M 进行添加已有商品的个数");
System.out.println("----3.输入 C 计算购物车里全部商品总价");
System.out.println("----4.输入 R 返回主菜单");
chose = sc.next();
switch (chose) {
case "D" :
case "M" :
String strDM = new String();
int change = 1; //删除是变为 -1, 添加时为 1;
if(chose.equals("D")) {
change = -1;
strDM = "删除";
}
if(chose.equals("M")) {
change = 1;
strDM = "添加";
}
String mChose = new String();
mChose = "N";
while(!mChose.equals("Y")) {
cart.showCart(itemsList);
System.out.print("请输入要选择的商品的ID:(只能选择在购物车中出现的ID)");
str = sc.next();
while(!Protect.isLegal(str, cart)) {
System.out.println("你的输入有误!请输入正确的ID!(只能选择在购物车中出现的ID)");
System.out.print("请输入要选择的商品的ID:");
str = sc.next();
}
id = Integer.parseInt(str);
System.out.printf("要%s多少个%s呢? ",strDM ,itemsList.getName(id)); //
str = sc.next();
if(chose.equals("M"))
while(!Protect.isLegal(str, itemsList.getStoke(id))) {
System.out.printf("你的输入有误!请输入范围从0到%d之间的数字\n",itemsList.getStoke(id));
System.out.printf("请输入要添加的%s的数量:",itemsList.getName(id));
str = sc.next();
}
if(chose.equals("D"))
while(!Protect.isLegal(str, cart.getNumber(id))) {
System.out.printf("你的输入有误!请输入范围从0到%d之间的数字\n",cart.getNumber(id));
System.out.printf("请输入要删除的%s的数量:",itemsList.getName(id));
str = sc.next();
}
int number = Integer.parseInt(str);
System.out.printf("\n确定要%s%d个%s吗? ", strDM, number, itemsList.getName(id)); //库存
System.out.printf("\n输入 Y 确定%s,其它键取消\n",strDM);
String flag = sc.next();
if(flag.equals("Y")) {
cart.putItems(id, number * change, itemsList);
System.out.printf("%s成功!\n", strDM);
}
else {
System.out.printf("%s失败!\n", strDM);
}
System.out.printf("输入 Y 确定结束%s,其它键继续操作!\n",strDM);
mChose = sc.next();
}
break;
case "C":
System.out.printf("\n你的购物车里所有商品的总价为 %d元 \n", cart.calculatePrice(itemsList));
System.out.println("输入任意键继续!");
stop = sc.next();
break;
case "R":
return;
default:
System.out.println("\n输出错了!请输入字符 D 或 M 或 C 或 R");
System.out.print("请输入你的选择: ");
break;
}
}
}
}
输入合法检测功能:
package Item;
public class Protect {
private static boolean isDigit(String str){
char[] cList = str.toCharArray();
for (char c : cList) {
if(!Character.isDigit(c)) {
return false;
}
}
return true;
}
private static boolean isExtent(int low, int high, int number) {
if(number > high)
return false;
if(number < low)
return false;
return true;
}
//输入str,检查是否合法
public static boolean isLegal(String str, int low, int high) {
if(!Protect.isDigit(str))
return false;
Integer number = Integer.parseInt(str);
if(!Protect.isExtent( low, high, number))
return false;
return true;
}
public static boolean isLegal(String str, ShopCart cart) { //判断ID是否存在在购物车中
if(!Protect.isDigit(str))
return false;
for(int i=0; i<cart.itemsShop.size(); i++) {
int id = cart.itemsShop.get(i);
if(Integer.parseInt(str) == id)
return true;
}
return false;
}
public static boolean isLegal(String str, int stock) {
if(!Protect.isDigit(str))
return false;
if(Integer.parseInt(str) > stock)
return false;
return true;
}
}