首页 > 技术文章 > 第1次任务:购物车程序的面向对象设计

letmee 2021-10-22 01:38 原文

任务

编码规范:使用英文对类、方法、包进行命名(查英文词典,不得出现拼音)。参考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;
}


}

运行结果展示






推荐阅读