第1次任务:购物车程序的面向对象设计
任务
编码规范:使用英文对类、方法、包进行命名(查英文词典,不得出现拼音)。参考JAVA编码规范,进行类命名,方法命名、包命名,合适的缩进,有意义的变量名。见参考资料1中的1.1-1.4。
前期调查与功能设计:调查京东商城或者亚马逊商城中的购物车,体验从搜索商品、加入购物车、操作购物车、下单全过程,思考该过程可能包含的类。演示中要求图多字少。
面向对象设计:以面向对象的方法编写购物车代码。先设计有什么类,再考虑什么方法放到那个类中合适。初期可不用完成具体功能,只要将类名、类之间的关系、方法名设计好即可。见参考资料2、3。注意学习类与类之间的关系(先重点掌握关联关系与依赖关系)。
PPT制作或博客制作并上台演示:演示前,请务必自己在同学面前预演一遍。
注意:初期将重点放在面向对象设计、命名规范。
0、人员分工
1、前期调查
- 以淘宝为例,搜索商品联想拯救者电脑,需要商品类Goods将其存放。
- 可将其加入购物车,需要购物车类ShoppingCart。
- 点开商品可显示详细属性,如商品名称,价格,库存,单价等。
- 用户可在购物车中进行对商品进行数量增减,选择并删除商品,选择并下单商品等相关操作
- 购物车具有计算所有商品的价格与数量的功能。
2、系统功能结构图
3、系统描述
商城类:
显示菜单,展示商城所具有的商品给用户。
商品类:
存储商品相关信息
购物车类:
添加,减少,删除购物车商品,计算购物车内商品总价格。
4、UML图
5、面向对象的封装性
JAVA:面向对象的编程语言。在此购物车案例中,不同的执行对象有不同的操作要实行,因此,先将对象和方法先找出来一一对应,即将名词与动词找出来,再将名词与动词逐一对应相应的对象与方法来设计代码。这样针对不同对象设计不同的方法,更加的具有逻辑,条理更清楚,
而对于商品类,展示商品信息,搜索商品信息,商品列表这些方法,可以设置成public属性,供其他包调用这些方法,使功能更完善。
增加商品到购物车与获得购物车列表,设置成public属性
6、项目包结构与关键代码
Shopping
商城类
package shoppingcart;
import java.util.Scanner;
import java.util.ArrayList;
public class Shopping {
public static void Menu(ArrayList good,ArrayList cart)
{
System.out.println("亲爱的用户,您好!欢迎来到XX商城!");
System.out.println("请选择以下服务:");
System.out.println("1.进入市场查看商品:");
System.out.println("2.查看我的购物车:");
System.out.println("3.离开商场:");
Scanner stdin=new Scanner(System.in);
int choice=stdin.nextInt();
while(choice<=0||choice>3)
{
System.out.println("输入的选择有误!!请重新选择!");
choice=stdin.nextInt();
}
switch(choice)
{
case 1:Market(good,cart);
break;
case 2:System.out.println("我的购物车:");
ShoppingCart.ShowCar(cart, good);
break;
case 3:System.out.println("欢迎下次再来!!!");
return;
}
}
public static void Market(ArrayList good,ArrayList cart)
{
System.out.println("欢迎进入商城:");
for(Object goods:good)
{
System.out.println(goods.toString());
}
System.out.println("请输入你的选择:");
System.out.println("1.添加商品到购物车");
System.out.println("2.通过商品种类查找商品");
System.out.println("3.通过商品名查找商品");
System.out.println("4.通过商品编号查找商品");
Scanner stdin=new Scanner(System.in);
int choice=stdin.nextInt();
while(choice<=0||choice>4)
{
System.out.println("输入的选择有误!!请重新选择!");
choice=stdin.nextInt();
}
switch(choice)
{
case 1:
ShoppingCart.Add(good, cart);
break;
case 2:Goods.TypeToGoods(good,cart);
break;
case 3:Goods.NameToGoods(good,cart);
break;
case 4:Goods.MarkToGoods(good,cart);
return;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList good=new ArrayList<Goods>();
ArrayList cart=new ArrayList<ShoppingCart>();
Goods goods0=new Goods("原神抱枕", "日用品", 302, 11.9, 0);// Goods(String name, String type, int num, double price)
Goods goods1=new Goods("卡通二次元水杯", "日用品", 453, 39.8, 1);
Goods goods2=new Goods("CHRISTINA小提琴", "乐器", 32, 7650, 2);
Goods goods3=new Goods("德国进口嘉云糖", "食品", 554, 33.4, 3);
Goods goods4=new Goods("百达翡丽腕表", "奢侈品", 23, 555006, 4);
Goods goods5=new Goods("KASHAT41寸亮光单板吉他", "乐器", 344, 458, 5);
good.add(goods0);
good.add(goods1);
good.add(goods2);
good.add(goods3);
good.add(goods4);
good.add(goods5);
Menu(good,cart);
}
}
Goods
商品类
package shoppingcart;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
public class Goods {
private String name,type;//商品名、商品种类
private int num;//商品剩余数量
private double price;//商品价格
private int mark=0;//商品编号
public Goods(String name, String type, int num, double price,int mark) {
super();
this.name = name;
this.type = type;
this.num = num;
this.price = price;
this.mark=mark;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getMark() {
return mark;
}
public void setMark(int mark) {
this.mark = mark;
}
@Override
public String toString() {
return "编号:"+mark+" 商品名:"+name+" 价格:"+price+" 剩余数量:"+num+" 商品种类:"+type;
}
public void Display()
{
System.out.println(this.toString());
}
public static void MarkToGoods(ArrayList good,ArrayList cart)//测试正确
{
Scanner stdin=new Scanner(System.in);
System.out.println("请输入所寻商品的编码:");
int mark=stdin.nextInt();
int bool=0;
for(Object e:good)
{
if(((Goods)e).getMark()==mark)
{
bool=1;
System.out.println("查找到以下结果:");
System.out.println(e.toString());
}
}
if(bool==0)
{
System.out.println("未找到相关商品!");
}
Choice(cart,good);
}
public static void NameToGoods(ArrayList good,ArrayList cart)//测试正确
{
Scanner stdin=new Scanner(System.in);
System.out.println("请输入所寻商品的名字:");
String name=stdin.next();
int bool=0;
for(Object e:good)
{
if(name.equals(((Goods)e).getName()))
{
bool=1;
System.out.println("查找到以下结果:");
System.out.println(e.toString());
}
}
if(bool==0)
{
System.out.println("未找到相关商品!");
}
Choice(cart,good);
}
public static void TypeToGoods(ArrayList good,ArrayList cart)//测试正确
{
Scanner stdin=new Scanner(System.in);
System.out.println("请输入所寻商品的种类:");
String type=stdin.next();
int bool=0;
for(Object e:good)
{
if(type.equals(((Goods)e).getType()))
{
bool=1;
System.out.println("查找到以下结果:");
System.out.println(e.toString());
}
}
//使用下方注释掉的代码,输出的总是所查找的商品的下一个商品
// Iterator<Goods>it=good.iterator();
// while(it.hasNext())
// {
// if(type.equals(((Goods)(it.next())).getType()))
// {
// bool=1;
// System.out.println("查找到以下结果:");
// System.out.println(it.next());
// }
// }
if(bool==0)
{
System.out.println("未找到相关商品!");
}
Choice(cart,good);
}
public static void Choice(ArrayList cart,ArrayList good)
{
System.out.println("请输入你的选择:");
System.out.println("1.返回商城");
System.out.println("2.返回主菜单");
System.out.println("3.返回购物车");
System.out.println("4.离开系统");
Scanner stdin=new Scanner(System.in);
int choice=stdin.nextInt();
while(choice<=0||choice>4)
{
System.out.println("输入的选择有误!!请重新选择!");
choice=stdin.nextInt();
}
switch(choice)
{
case 1:Shopping.Market(good, cart);
break;
case 2:Shopping.Menu(good, cart);
break;
case 3:ShoppingCart.ShowCar(cart, good);
break;
case 4:return;
}
}
}
ShoppingCart
购物车类
package shoppingcart;
import java.util.ArrayList;
import java.util.Scanner;
public class ShoppingCart extends Goods{
private int count=0;//购物车内商品数量
private int number;//商品加购的数量
private double total;
public ShoppingCart(String name, String type, int num, double price, int mark, int number,double total) {
super(name, type, num, price, mark);
this.number = number;
this.total=total;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public double getTotal() {
return total;
}
public void setTotal(double total) {
this.total = total;
}
public static void Delete(ArrayList good,ArrayList cart)
{
//考虑没有该商品的情况
System.out.println("请输入要删除的购物车商品编号");
Scanner stdin=new Scanner(System.in);
int mark=stdin.nextInt();
boolean bool=true;
for(int i=0;i<cart.size();i++)
{
if(((Goods)cart.get(i)).getMark()==mark)
{
cart.remove(i);
bool=false;
}
}
if(bool)
{
System.out.println("抱歉,没有在购物车找到该商品");
}
else
System.out.println("删除成功");
ShowCar(cart,good);
}
public static void Add(ArrayList good,ArrayList cart)
{
//还需要考虑没有该商品的情况
System.out.println("请输入要加入购物车商品编号以及所要添加的数量");
Scanner stdin=new Scanner(System.in);
int mark=stdin.nextInt();
while(mark<=0||mark>=6)
{
System.out.println("商城内没有该商品。请重新选择商品!");
System.out.println("请重新输入商品编号和添加数量:");
mark=stdin.nextInt();
}
int number=stdin.nextInt();
Goods id=(Goods)good.get(mark);
// System.out.println("测试");
ShoppingCart mycart=new ShoppingCart(id.getName(), id.getType(), id.getNum(), id.getPrice(), id.getMark(),number,number*id.getPrice());
//String name, String type, int num, double price, int mark, int number
int bool=0;
// System.out.println("测试");
for(int i=0;i<cart.size();i++)
{
//System.out.println("测试");
if(((Goods)cart.get(i)).getMark()==mark)
{
bool=1;
System.out.println("该商品已存在购物车,请问是否需要对该商品的数量加"+number+"!");
System.out.println("1.需要 2.不需要");
int choice=stdin.nextInt();
while(choice<=0||choice>2)
{
System.out.println("输入的选择有误!!请重新选择!");
choice=stdin.nextInt();
}
switch(choice)
{
case 1:
//改变总数
((ShoppingCart)cart.get(i)).setNumber( ((ShoppingCart)cart.get(i)).getNumber()+number);
//改变总价
((ShoppingCart)cart.get(i)).setTotal( ((ShoppingCart)cart.get(i)).getTotal()+number*((ShoppingCart)cart.get(i)).getPrice());
//这边忽略了加入之后总价也要改变
System.out.println("已对购物车中商品数量加"+number+"!");
ShowCar(cart,good);
break;
case 2:
System.out.println("您已取消该操作!");
ShowCar(cart,good);
break;
}
}
}
// System.out.println("测试");
if(bool==0)
{
cart.add(mycart);
System.out.println("添加成功!!");
ShowCar(cart,good);//没有输出添加的数量
}
}
public static void ShowCar(ArrayList cart,ArrayList good)
{
for(Object e:cart)
{
System.out.println(e.toString());
}
Choice1();
Choice(cart, good);
}
public static void Choice1()
{
System.out.println("请输入你的选择:");
System.out.println("1.返回商城");
System.out.println("2.返回主菜单");
System.out.println("3.添加购物车商品");
System.out.println("4.删除购物车商品");
System.out.println("5.减少购物车内某件商品的数量");
System.out.println("6.增加购物车某件商品的数量");
System.out.println("7.计算购物车商品总价格");
System.out.println("8.离开系统");
}
public static void Choice(ArrayList cart,ArrayList good)
{
Scanner stdin=new Scanner(System.in);
int choice=stdin.nextInt();
while(choice<=0||choice>8)
{
System.out.println("输入的选择有误!!请重新选择!");
choice=stdin.nextInt();
}
switch(choice)
{
case 1:Shopping.Market(good, cart);
break;
case 2:Shopping.Menu(good, cart);
break;
case 3:ShoppingCart.Add(good, cart);
break;
case 4:ShoppingCart.Delete(good, cart);
break;
case 5:ShoppingCart.Subtraction(cart,good);
break;
case 6:ShoppingCart.Addition(cart,good);
break;
case 7:ShoppingCart.Total(cart,good);
break;
case 8:return;
}
}
public static void Total(ArrayList cart,ArrayList good)
{
double sum=0;
for(Object e:cart)
{
sum+=((ShoppingCart)e).getTotal();
}
System.out.println("购物车内商品总价为:"+sum);
ShowCar(cart,good);
}
public static void Addition(ArrayList cart,ArrayList good)//加
{
//如果购物车内没有该商品,就无法增加
Scanner stdin=new Scanner(System.in);
System.out.println("请输入你想要增加数量的商品编码,以及所想要增加的数量:");
int mark=stdin.nextInt();
int number=stdin.nextInt();
int bool=0;
for(Object e:cart)
{
if(((ShoppingCart)e).getMark()==mark)
{
bool=1;
//这边相同,记得总价也要改变!!
((ShoppingCart)e).setNumber(((ShoppingCart)e).getNumber()+number);
((ShoppingCart)e).setTotal(((ShoppingCart)e).getTotal()+number*((ShoppingCart)e).getPrice());
}
}
if(bool==0)
{System.out.println("购物车内没有该商品,请先将该商品加入购物车");}
ShowCar(cart,good);
}
public static void Subtraction(ArrayList cart,ArrayList good)//减
{
//
int bool=0;
Scanner stdin=new Scanner(System.in);
System.out.println("请输入你想要减少数量的商品编码,以及所想要减少的数量:");
int mark=stdin.nextInt();
int number=stdin.nextInt();
for(Object e:cart)
{
bool=1;
if(((ShoppingCart)e).getMark()==mark)
{
if(number<=((ShoppingCart)e).getNumber())
{
((ShoppingCart)e).setNumber(((ShoppingCart)e).getNumber()-number);
((ShoppingCart)e).setTotal(((ShoppingCart)e).getTotal()-number*((ShoppingCart)e).getPrice());
}
else
{
System.out.println("减少的数量大于购物车内该商品的加购数量,是否选择直接删除?");
System.out.println("1.是 2.否");
int choice=stdin.nextInt();
while(choice<=0||choice>2)
{
System.out.println("输入的选择有误!!请重新选择!");
choice=stdin.nextInt();
}
switch(choice)
{
case 1:
ShoppingCart.Delete(good, cart);
break;
case 2:
System.out.println("您已取消该操作!");
break;
}
}
}
}
if(bool==0)
{System.out.println("购物车内没有该商品,请先将该商品加入购物车");}
ShowCar(cart,good);
}
@Override
public String toString() {
return super.toString()+" 加购数量:"+number+" 总价:"+total;
}
}
运行结果展示