zoukankan      html  css  js  c++  java
  • 购物车程序的面向对象设计

    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("
    输出错了!请输入数字 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个
    ", 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("
    抱歉,你输入有误,请输入范围 0 到 %d 的商品数字ID!
    ",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("
    抱歉,你输入有误,请输入范围 0 到 %d 的商品个数!
    ",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("
    若要展示当前购物车内的商品,请输入 Y , 否则输入其它任意键继续购物:");
    			if((choose = sc.next()).equals("Y") || choose.equals("y"))
    				cart.showCart(itemsList);
    			System.out.print("
    输入Y,则停止购物返回主菜单;否则输入任意键继续购物:");
    			choose = sc.next();
    		}	
    		System.out.println("
    欢迎下次再使用我们的购物系统!");
    		//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
    ",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之间的数字
    ",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之间的数字
    ",cart.getNumber(id));
    							System.out.printf("请输入要删除的%s的数量:",itemsList.getName(id));
    							str = sc.next();
    						}
    					
    					int number = Integer.parseInt(str);
    					System.out.printf("
    确定要%s%d个%s吗? ", strDM, number, itemsList.getName(id)); //库存
    					
    					System.out.printf("
    输入 Y 确定%s,其它键取消
    ",strDM);
    					
    					String flag = sc.next();
    					if(flag.equals("Y")) {	
    						cart.putItems(id, number * change, itemsList);
    						System.out.printf("%s成功!
    ", strDM);
    					}
    					else {
    						System.out.printf("%s失败!
    ", strDM);
    					}		
    					
    					System.out.printf("输入 Y 确定结束%s,其它键继续操作!
    ",strDM);
    					mChose = sc.next();
    				}		
    				break;
    				
    			case "C":
    				System.out.printf("
    你的购物车里所有商品的总价为 %d元 
    ", cart.calculatePrice(itemsList));
    				System.out.println("输入任意键继续!");
    				stop = sc.next();
    				break;
    				
    			case "R":
    				return;
    				
    			default:
    				System.out.println("
    输出错了!请输入字符 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;
    	}
    }
    
  • 相关阅读:
    isequal 和startswith 使用
    UVa10340
    UVa1368
    UVa455
    UVa1225
    UVa1586
    UVa 1585
    UVa10082
    UVa272
    NYOJ1
  • 原文地址:https://www.cnblogs.com/ywk2002/p/15376990.html
Copyright © 2011-2022 走看看