2020Java-第1次任务-面向对象设计(购物车)pro

第1次任务-面向对象设计(购物车)

本次的作业内容:

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

作业来源:https://www.cnblogs.com/zhrb/p/9678707.html

目标:

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

1.编码规范:

在编写该程序的代码时,我始终使用驼峰命名法,没有拼音,全部都是在英文字典或360翻译寻找到的名称并且类和他们的属性、方法的名称都是根据它们自身的作用或意义来进行命名。变量名也以靠近自身作用的方向进行命名。而类的命名都是根据讲故事的方法分离出来的“名词”,我们在这篇博客的下文就会讲到“讲故事来解决问题”的方法。

2.前期调查与功能设计:

参考资料:关联关系与依赖关系:https://blog.csdn.net/zhuyu714997369/article/details/51983871

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

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

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

最后,当我们结算时,系统会发送电子账单,显示购买的物品以及他们的数量、总价格。

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

1.需要有商品的搜索功能(可能需要一个用户类来识别并执行用户操作)

2.需要有购物车中物品的添加功能和删除功能(需要一个购物车类来存放购买物品的数量和总价)

3.在购物车中需要有显示结算总价的程序(需要一个账单类来打印支付凭条)

4.由于个人设计的程序中的商品不会像网络商场一样多的数不过来,所以可以考虑做出一个可以显示商城中所有商品的商品清单功能。(需要一个商品类来存储商品的基本信息,还可能有全部商品信息输出的功能)

3.系统功能结构图

4.面向对象设计:

运用讲故事的方法来解决问题:

购物的故事:(用户)在商城中可以[搜索]、[浏览](商品),看到想买的商品可以将商品[放入](购物车),可以放进多个,并且可以对购物车中的物品进行[添加]和[删减]。可以在购物车中获得所有商品价格,最后选择[结算]可以生成并打印(账单)。

在上面的故事中,我们用圆括号圈住了一些重点名词,这些名词可以作为类,用户类、商品类、购物车类等,用方括号圈住的动词就是各个类里面的方法,比如搜索,我们可以把它当作(用户类)中的[搜索方法],再比如[添加]可以当作(购物车)类的[添加方法],这样,通过讲故事的方法,我们就可以思路清晰的找出一个程序所需要的类和其中的方法。

5.UML类图:

6.封装性:

我们在编写程序时,有一些方法的接口可能会被他人利用,这样的话,我们不想让他人做的事就可能会通过这些接口来实现,或者不想让他人看到的信息就可以被外界看到。所以,我们需要将一些方法改为private,仅类内程序能够调用,在想办法在从内部调用的基础上让外部可以在可控范围内操作,简单一点来说就是建立一道门将我们的方法保护起来,比如说本程序的下列代码,因为list()方法写的太烂,我不想让用户看到这个方法,那么我可以将这个方法设置为private,外部只能通过调用showList()方法来看到我的商品架,从而向用户隐藏了list()这个方法。

7.程序功能介绍:

主界面:可以输入数字选项进行功能的实现

1)商品清单(打印商城中所有的物品的相关信息)

2)商品查询(ID)(通过输入商品ID来查询物品)

3)商品查询(Name)(通过输入商品名称来查询并购买物品)

4)商品购买(通过输入购买商品的ID和购买数量将对应数量的该商品放入购物车;ID不存在则显示添加失败)

5)商品删除(输入删除商品的ID和数量来将对应数量的该商品拿出购物车;ID不存在则显示删除失败;当所删除的数量大于了该商品在购物车中的已有数量时,系统默认为该商品在购物车中有0个)

6)查看购物车(可以看到购物车中已有的物品、数量、应付款额)(这里我之前添加了12+3个牙刷和2个水桶,又拿出了1个牙刷,所以购物车中只有14个牙刷和2个水桶)

7)清空购物车

执行命令前:

执行命令:

执行命令后:

8)购物车预结算(根据购物车中的信息生成电子账单)

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

0)包结构:
1)shopping包(Main类)
这个包中含有的Main类是实现用户与商城互动的类,相当于用户的身体,可以对商店做出一系列商店已规定允许做出的动作。
2)shop包(Shelves类、ShoppingCart类、Show类)
这个包中含有的几个类都是属于商店本身的,其中包含有商城中的物品信息,还有一系列购物的方法,包括查看物品、搜索物品、增加物品、减少物品、清空物品、结账等方法。
3)display包(Ui类)
这个包中含有的是操作界面,用来指引用户进行操作。

总结:这样分包,即有逻辑性,而且除了Main类之外,不需要让其他的某个类导入其他的包才能工作,只需要让Main类导入其他包中的类即可。

1)shopping包

Main类

package shopping;

import java.util.Scanner;

import display.Ui;
import shop.Shelves;
import shop.ShoppingCart;
import shop.Show;

public class Main {

	public static void main(String[] args) {
		Scanner search = new Scanner(System.in);
		Shelves.showList();// 加载商品

		@SuppressWarnings("resource")
		Scanner choose = new Scanner(System.in);// 引入参数
		@SuppressWarnings("resource")
		Scanner goodsId = new Scanner(System.in);// 引入参数
		@SuppressWarnings("resource")
		Scanner pause = new Scanner(System.in);// 暂停参数

		while (true) {
			Ui.mainUi();
			System.out.print("请输入选项:");
			int Choose = choose.nextInt();

			switch (Choose) {
			case 1:
				Shelves.showGoods();// 显示商品

				System.out.println("<输入任意数字,按回车返回主界面>");
				@SuppressWarnings("unused")
				String Pause = pause.next();
				break;
			case 2:
				System.out.println("请输入商品ID:");
				int id = search.nextInt();

				if (Shelves.searchGoodsFromId(id) == 0)
					System.out.println("没有找到该商品!");
				System.out.println("<输入任意数字,按回车返回主界面>");
				Pause = pause.next();
				break;
			case 3:
				System.out.println("请输入商品名称:");
				String name = search.next();
				if (Shelves.searchGoodsFromName(name) == 0)
					System.out.println("没有找到该商品!");
				System.out.println("<输入任意数字,按回车返回主界面>");
				Pause = pause.next();
				break;
			case 4:
				System.out.println();
				System.out.println("请输入您需要的商品的对应ID:");
				int choiceGoods = goodsId.nextInt();
				System.out.println("请输入您需要的商品的数量:");
				int choiceAddNumber = goodsId.nextInt();
				if (ShoppingCart.addGoods(choiceGoods, choiceAddNumber) == 1)
					System.out.println("添加成功!");// 在购物车单中添加商品
				else
					System.out.println("添加失败!");// 判断输入参数是否有效
				System.out.println("<输入任意数字,按回车返回主界面>");
				Pause = pause.next();
				break;
			case 5:
				System.out.println("请输入您需要删除的商品的对应ID:");
				int choiceGoods11 = goodsId.nextInt();
				System.out.println("请输入您需要减少的商品的数量:");
				int choiceSubNumber = goodsId.nextInt();
				if (ShoppingCart.subGoods(choiceGoods11, choiceSubNumber) == 1)
					System.out.println("删除商品成功!");// 在购物车单中添加商品
				else
					System.out.println("删除商品失败!");// 判断输入参数是否有效
				System.out.println("<输入任意数字,按回车返回主界面>");
				Pause = pause.next();
				break;
			case 6:
				ShoppingCart.showCart();
				System.out.println("<输入任意数字,按回车返回主界面>");
				Pause = pause.next();
				break;
			case 7:
				ShoppingCart.cleanGoods();
				System.out.println("<购物车内物品已清空>");
				System.out.println("<输入任意数字,按回车返回主界面>");
				Pause = pause.next();
				break;
			case 8:
				Show.showPay();
				System.out.println("<输入任意数字,按回车返回主界面>");
				Pause = pause.next();
				break;
			case 0:
				break;

			}
			for (int i = 0; i < 25; i++)
				System.out.println();
			if (Choose == 0)
				break;
		}

		Ui.endUi();
	}
}

2)shop包

ShoppingCart类

package shop;

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

	public static int[] getPayNumber() {
		return payNumber;
	}

	public static void setPayNumber(int[] payNumber) {
		ShoppingCart.payNumber = payNumber;
	}

	public static int addGoods(int goodsId, int goodsAddNumber) {// 增加购物车商品

		for (int i = 0; i < Shelves.getGoodsNumber(); i++) {
			if (i == goodsId) {
				payNumber[i] += goodsAddNumber;
				return 1;
			}
		}
		return 0;
	}

	public static int  subGoods(int goodsId, int goodsSubNumber) {// 减少购物车商品

		for (int i = 0; i < Shelves.getGoodsNumber(); i++) {
			if (i == goodsId) {
				payNumber[i] = payNumber[i] - goodsSubNumber;
				if (payNumber[i] < 0)
					payNumber[i] = 0;// 保证数字不小于0
				return 1;
			}
		}
		return 0;
	}

	public static void cleanGoods() {// 清空购物车商品
		for (int i = 0; i < Shelves.getGoodsNumber(); i++) {
			payNumber[i] = 0;// 保证数字不小于0

		}

	}

	public static void showCart() {// 显示购物车中的商品
		double countCartPay = 0;
		System.out.println("———————————— 您的购物车 ————————————");
		System.out.println("商品ID" + "	" + "商品名" + "	" + "商品单价" + "	  " + "购买数量");
		System.out.println();

		for (int i = 0; i < Shelves.getGoodsNumber(); i++) {
			if (ShoppingCart.payNumber[i] != 0) {
				System.out.println(Shelves.getGoodsId()[i] + "	" + Shelves.getGoodsName()[i] + "	"
						+ Shelves.getGoodsPrice()[i] + "	* " + ShoppingCart.payNumber[i]);
			}
			countCartPay = countCartPay + (ShoppingCart.payNumber[i] * Shelves.getGoodsPrice()[i]);
		}
		System.out.println();
		System.out.println("	您的账单估算 :  " + String.format("%.2f", countCartPay));
	}

}

Shelves类

package shop;

import java.util.*;

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

	public static int getGoodsNumber() {
		return goodsNumber;
	}

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

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

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

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

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

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

	public static void setGoodsPrice(double[] goodsPrice) {
		Shelves.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 int searchGoodsFromId(int id) {
		@SuppressWarnings("resource")
		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 (true) {
						if (ShoppingCart.addGoods(goodsId[i], number) == 1)
							System.out.println("添加成功!");// 在购物车单中添加商品
						else
							System.out.println("添加失败!");
					}
				}
				return 1;
			}
		}
		return 0;
	}

	public static int searchGoodsFromName(String name) {
		@SuppressWarnings("resource")
		Scanner search = new Scanner(System.in);

		for (int i = 0; i < goodsNumber; i++) {
			if (name.equals(goodsName[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 (true) {
						if (ShoppingCart.addGoods(goodsId[i], number) == 1)
							System.out.println("添加成功!");// 在购物车单中添加商品
						else
							System.out.println("添加失败!");
					}
				}
				return 1;
			}
		}
		return 0;
	}

	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] = 10.5;
				break;
			case 1:
				goodsName[i] = "牙刷";
				goodsPrice[i] = 6.0;
				break;
			case 2:
				goodsName[i] = "果汁";
				goodsPrice[i] = 4;
				break;
			case 3:
				goodsName[i] = "汽水";
				goodsPrice[i] = 3;
				break;
			case 4:
				goodsName[i] = "铅笔";
				goodsPrice[i] = 1;
				break;
			case 5:
				goodsName[i] = "矿泉水";
				goodsPrice[i] = 2;
				break;
			case 6:
				goodsName[i] = "水桶";
				goodsPrice[i] = 22;
				break;
			case 7:
				goodsName[i] = "薯片";
				goodsPrice[i] = 5;
				break;
			case 8:
				goodsName[i] = "泡面";
				goodsPrice[i] = 4;
				break;
			case 9:
				goodsName[i] = "袜子";
				goodsPrice[i] = 6;
				break;
			}
		}
	}

}

Show类

package shop;

public class Show {

	public static void showPay() {// 显示购物车中的商品
		double countWillPay = 0;
		System.out.println("");
		System.out.println("——————————————————————————————————");
		System.out.println("商品ID" + "	" + "商品名" + "	" + "商品单价" + "	* " + "购买数量");
		System.out.println("==================================");

		for (int i = 0; i < Shelves.getGoodsNumber(); i++) {
			if (ShoppingCart.getPayNumber()[i] != 0) {
				System.out.println(Shelves.getGoodsId()[i] + "	" + Shelves.getGoodsName()[i] + "	"
						+ Shelves.getGoodsPrice()[i] + "	* " + ShoppingCart.getPayNumber()[i]);
			}
			countWillPay = countWillPay + (ShoppingCart.getPayNumber()[i] * Shelves.getGoodsPrice()[i]);
		}
		System.out.println("==================================");
		System.out.println("	实 际 应 付 :  " + String.format("%.2f", countWillPay));
		System.out.println("——————————————————————————————————");
	}
}

3)display包

Ui类

package display;

public class Ui {

	public static void mainUi() {
		System.out.println("选项表");
		System.out.println("1)商品清单");
		System.out.println("2)商品查询(ID)");
		System.out.println("3)商品查询(Name)");
		System.out.println("4)商品购买");
		System.out.println("5)商品删除");
		System.out.println("6)查看购物车");
		System.out.println("7)清空购物车");
		System.out.println("8)购物车预结算");
		System.out.println("0)退出");
	}

	public static void endUi() {
		System.out.println("  ==================================");
		System.out.println("((      感谢您的使用,谢谢惠顾!        ))");
		System.out.println("  ==================================");
	}

}
posted @ 2020-10-14 22:21  勤政  阅读(292)  评论(0编辑  收藏  举报