第1次任务:购物车程序的面向对象设计

任务 姓名
编码规范、前期调查与功能设计、博客制作 黄帅
面向对象设计、博客制作、功能设计 韩龙飞

本次的作业内容:
要求体验商城的商品搜索、购物车中商品的加入和删除操作以及下单等功能。在观察各大网络商城的购物车之后,根据其特点自制一个购物车小程序。
目标:

  • 学会使用讲故事的方式找到系统中可能包含的类与属性
  • 理解封装

任务:

1.编码规范

驼峰命名法
不使用拼音和英文组合
方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格
包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。
包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。

2.前期调查与功能设计

我们以京东商城为例来进行探讨,首先,进入商城主界面时,我们可以看到许多商城中的物品,而上方的搜索栏可以帮助我们搜索想要的物品。

点击物品图标,我们可以看到物品的详细信息,还可以执行“加入购物车“这一操作。

进入购物车时,我们能够看到自己购买了什么东西、购买多少个,以及预估的结算价格,而且我们可以在购物车中执行删除操作,能够删除任意商品、任意数量。

从以上观察的情况来看,购物车程序所需要实现的功能大致有:

  • 需要有商品的搜索功能(可能需要一个用户类来识别并执行用户操作)
  • 需要有购物车中物品的添加功能和删除功能(需要一个购物车类来存放购买物品的数量和总价)
  • 在购物车中需要有显示结算总价的程序(需要一个账单类来打印支付凭条)
  • 由于个人设计的程序中的商品不会像网络商场一样多的数不过来,所以可以考虑做出一个可以显示商城中所有商品的商品清单功能。(需要一个商品类来存储商品的基本信息,还可能有全部商品信息输出的功能)

3.面向对象设计


在上述的故事中,用红色字代表可能的对象(名词)或属性,用蓝色字代表可能的方法(动词)。
这样,通过讲故事的方法,我们就可以思路清晰的找出一个程序所需要的类和其中的方法。

4.系统功能结构图

5.系统描述


6.UML类图

7.面向对象的封装性

  • Mall类中将商品的属性声明为private并用setter、getter的方法进行数据封装

8.项目包结构与关键代码

项目包结构

1.shopping包

该包中有一个Main类,用来进行用户与程序的人机交互。

2.Mall包

该包主要有商城中商品的信息和购物车的增、删、改、查等一系列操作的核心方法。

3.display包

可视化界面,方便用户操作。
按类进行分包方便后续查找修补,有逻辑性,而且不用在main中频繁的导入类。只需要把Main类导入其他包中的类就可以了。

主要功能


关键代码

package shop;

import java.math.BigDecimal;
import java.util.Scanner;

public class Mall {
	private static int goodsNumber = 10;
	private static int[] goodsId = new int[100];
	private static String[] goodsName = new String[100];
	private static BigDecimal[] goodsPrice = new BigDecimal[100];

	public static int getGoodsNumber() {
		return goodsNumber;
	}

	public static void setGoodsNumber(int goodsNumber) {
		Mall.goodsNumber = goodsNumber;
	}

	public static int[] getGoodsId() {
		return goodsId;
	}

	public static void setGoodsId(int[] goodsId) {
		Mall.goodsId = goodsId;
	}

	public static String[] getGoodsName() {
		return goodsName;
	}

	public static void setGoodsName(String[] goodsName) {
		Mall.goodsName = goodsName;
	}

	public static BigDecimal[] getGoodsPrice() {
		return goodsPrice;
	}

	public static void setGoodsPrice(BigDecimal[] goodsPrice) {
		Mall.goodsPrice = goodsPrice;
	}

	public static void showGoods() {
		System.out.println("商品ID	商品名	商品价格");
		for (int i = 0; i < goodsNumber; i++) {
			System.out.println(goodsId[i] + "	" + goodsName[i] + "	" + goodsPrice[i]);
		}
	}

	public static void buy(Scanner goodsId) {
		System.out.println("请输入您需要的商品的对应ID:");
		int choiceGoods = goodsId.nextInt();
		System.out.println("请输入您需要的商品的数量:");
		int choiceAddNumber = goodsId.nextInt();
		if (ShoppingCart.addGoods(choiceGoods, choiceAddNumber))
			System.out.println("添加成功!");// 在购物车单中添加商品
		else
			System.out.println("添加失败!");// 判断输入参数是否有效
		System.out.println("是否继续购买购买?[是(1)/否(0)]");
		int choice = goodsId.nextInt();
		if (choice == 1)
			buy(goodsId);
	}

	public static boolean searchGoodsFromId(int id) {
		Scanner search = new Scanner(System.in);
		for (int i = 0; i < goodsNumber; i++) {
			if (id == goodsId[i]) {
				System.out.println("已找到该商品 : ");
				System.out.println();
				System.out.println("商品ID	商品名	商品价格");
				System.out.println(goodsId[i] + "	" + goodsName[i] + "	" + goodsPrice[i]);

				System.out.print("是否添加到购物车?[是(1)/否(0)] :");
				int chioce = search.nextInt();
				if (chioce == 1) {
					System.out.print("添加数量?:");
					int number = search.nextInt();
					if (ShoppingCart.addGoods(goodsId[i], number))
						System.out.println("添加成功!");// 在购物车单中添加商品
					else
						System.out.println("添加失败!");
				}
				return true;
			}
		}
		return false;
	}

	

	public static void searchGoodsFromName() {
		Scanner search = new Scanner(System.in);
		System.out.println("请输入商品名称:");
		String name = search.next();
		int flag = 0;
		for (int i = 0; i < goodsNumber; i++) {
			if (goodsName[i].indexOf(name) != -1) {
				flag++;
				if (flag == 1) {
					System.out.println("查找结果如下 : ");
					System.out.println();
					System.out.println("商品ID	商品名	商品价格");
				}
				System.out.println(goodsId[i] + "	" + goodsName[i] + "	" + goodsPrice[i]);
			}
		}
		
		if(flag==0) {
			System.out.println("没有找到该商品!");
			System.out.println("是否继续查找?[是(1)/否(0)]");
			int choise = search.nextInt();
			if(choise==1) 
				searchGoodsFromName();
			return;
		}
		System.out.println("是否进行购买?[是(1)/否(0)]");
		int choise = search.nextInt();
		if(choise==1) {
			buy(search);
		}
		System.out.println("是否继续查找?[是(1)/否(0)]");
		choise = search.nextInt();
		if(choise==1) 
			searchGoodsFromName();
		
	}

	public static void showList() {
		list();
	}

	private static void list() {
		for (int i = 0; i < 10; i++) {
			goodsId[i] = i;
			switch (i) {
			case 0:
				goodsName[i] = "白色眼镜";
				goodsPrice[i] = new BigDecimal("10.5");
				break;
			case 1:
				goodsName[i] = "牙刷";
				goodsPrice[i] = new BigDecimal("6.0");
				break;
			case 2:
				goodsName[i] = "黄色眼镜";
				goodsPrice[i] = new BigDecimal("4");
				break;
			case 3:
				goodsName[i] = "牙膏";
				goodsPrice[i] = new BigDecimal("3");
				break;
			case 4:
				goodsName[i] = "铅笔";
				goodsPrice[i] = new BigDecimal("1");
				break;
			case 5:
				goodsName[i] = "矿泉水";
				goodsPrice[i] = new BigDecimal("2");
				break;
			case 6:
				goodsName[i] = "水桶";
				goodsPrice[i] = new BigDecimal("22");
				break;
			case 7:
				goodsName[i] = "水彩笔";
				goodsPrice[i] = new BigDecimal("5");
				break;
			case 8:
				goodsName[i] = "泡面";
				goodsPrice[i] = new BigDecimal("4");
				break;
			case 9:
				goodsName[i] = "袜子";
				goodsPrice[i] = new BigDecimal("6");
				break;
			}
		}
	}
}

package shop;

import java.math.BigDecimal;

import javax.xml.catalog.Catalog;

public class ShoppingCart {
	private static int[] cartNumber = new int[100];

	public static int[] getCartNumber() {
		return cartNumber;
	}

	public static void setCartNumber(int[] cartNumber) {
		ShoppingCart.cartNumber = cartNumber;
	}
	public static boolean addGoods(int goodsId,int goodsAddNumber) {
		for (int i = 0; i < Mall.getGoodsNumber(); i++) {
			if(i==goodsId) {
				cartNumber[i]+=goodsAddNumber;
				return true;
			}
		}
		return false;
	}
	public static boolean subGoods(int goodsId,int goodsSubNumber) {
		for (int i = 0; i < Mall.getGoodsNumber(); i++) {
			if(i==goodsId) {
				cartNumber[i]-=goodsSubNumber;
				if(cartNumber[i]<0)
					cartNumber[i]=0;
				return true;
			}
		}
		return false;
	}
	public static void cleanGoods() {
		for (int i = 0; i < Mall.getGoodsNumber(); i++) {
			cartNumber[i]=0;
		}
		System.out.println("<购物车内物品已清空>");
	}
	public static void showCart() {// 显示购物车中的商品
		BigDecimal countCartPay = new BigDecimal("0");
		System.out.println("———————————— 您的购物车 ————————————");
		System.out.println("商品ID" + "	" + "商品名" + "	" + "商品单价" + "	  " + "购买数量");
		System.out.println();
		for (int i = 0; i < Mall.getGoodsNumber(); i++) {
			if(cartNumber[i]!=0) {
				System.out.println(Mall.getGoodsId()[i] + "	" + Mall.getGoodsName()[i] + "	"
						+ Mall.getGoodsPrice()[i] + "	* " + cartNumber[i]);
			}
			BigDecimal num=new BigDecimal(Integer.toString(cartNumber[i]));
			BigDecimal beAdd = Mall.getGoodsPrice()[i].multiply(num);
			countCartPay =countCartPay.add(beAdd);
		}
		System.out.println();
		System.out.println("	您应支付 :  " +  countCartPay+"元");
		
	}
}

posted @ 2021-10-05 00:26  黄帅2011  阅读(66)  评论(0编辑  收藏  举报