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

零.人员分工

任务姓名
Commodity类;ShoppingCart类;面向对象设计;组长:林礼豪
Mall类;Main类;编码规范检查;洪希炀
Menu类;博客编写;前期调查与功能设计;陈炜棋

一.前期调查

调查了淘宝、拼多多、京东商城等电商的购物车设计,体验从搜索商品、加入购物车、编辑购物车、下单等的全过程。

以下用京东商城为例:

以下为购物车界面

二.系统功能结构图

三.系统描述

用户进入系统可以先将所有商品信息编号、名称、价格打印输出,之后可根据商品编号商品进行查找添加购物车。在购物车中用户可以使用商品编号对其中商品进行查看、移除,也可以直接对购物车中的所有商品进行结算下单

四.类设计说明

1.Main类(功能选择实现类)

概述:一个名为Main的Java类,代表一个简单的购物系统的主程序。

属性:

1.shoppingcart:一个购物车对象,用于存储用户选购的商品。
2.mall:一个商城对象,用于管理商品信息。
3.menu:一个菜单对象,用于显示用户界面菜单。

方法:

1.main(String[] args)方法:主程序入口,包含了程序的主要逻辑。在一个无限循环中,不断显示菜单并根据用户输入执行相应的操作。
2.AddToCart(Mall mall, ShoppingCart shoppingcart)方法:向购物车中添加商品的方法。用户输入商品编号和数量,然后将对应商品添加到购物车。
3.DisplayAllCommodities(Mall mall)方法:显示所有商品的方法,遍历商城中的商品列表并将它们打印出来。
4.SearchCommodity(Mall mall)方法:根据商品编号查找商品的方法,用户输入商品编号,然后查找并显示对应的商品信息。
5.DisplayCart(ShoppingCart shoppingcart)方法:显示购物车内容的方法,将购物车中的商品列表打印出来。
6.removeFromCart(ShoppingCart shoppingcart)方法:从购物车中移除商品的方法,用户输入要移除的商品编号,然后将该商品从购物车中移除。
7. CaculateOrder(ShoppingCart shoppingcart)方法:计算购物清单总价格的方法,将购物车中的商品价格汇总并显示。

2.Commodity类(商品信息类)

概述:一个名为Commodity的Java类,表示商品对象。

属性:

1.id:一个整数,表示商品的唯一编号。
2.name:一个字符串,表示商品的名称。
3.price:一个双精度浮点数,表示商品的价格。

方法:

1.Commodity()构造方法:无参构造方法。
2.Commodity(Integer id, String name, Double price)构造方法:带有参数的构造方法,用于初始化商品对象的属性。
3.getId()方法:获取商品的编号。
4.setId(Integer id)方法:设置商品的编号。
5.getName()方法:获取商品的名称。
6.setName(String name)方法:设置商品的名称。
7.getPrice()方法:获取商品的价格。
8.setPrice(Double price)方法:设置商品的价格。
9.hashCode()方法:重写Object类中的hashCode()方法,用于计算对象的哈希码。
10.equals(Object obj)方法:重写Object类中的equals()方法,用于比较两个商品对象是否相等。
11.toString()方法:重写Object类中的toString()方法,用于返回商品对象的字符串表示,包括商品编号、名称和价格。

3.Mall类(商品展示类)

概述:一个名为Mall的Java类,表示一个购物商城。

属性:

1.commoditie:一个私有属性,是一个List类型,用于存储商品对象Commodity的列表。

方法:

1.Mall()构造方法:初始化购物商城对象,创建了一个空的商品列表。
2.initCommodities()方法:初始化商品列表,创建了多个商品对象并将它们添加到commodities列表中。
3.getAllCommodities()方法:返回商品列表commodities,允许其他类访问所有商品的信息。
4.findCommodityById(int id)方法:根据商品编号(id)查找商品对象,如果找到则返回该商品对象,否则返回null。
5.getCommodities()方法:与getAllCommodities()方法相同,返回商品列表commodities。

4.Menu类(功能选择界面类)

概述:一个名为Menu的Java类,用于创建一个简单的超市菜单界面。

属性:无属性定义。

方法:

1.show方法:该方法用于显示超市菜单,它包括以下选项:

  • 展示所有商品
  • 根据编号查找商品
  • 添加商品到购物车
  • 查看购物车
  • 将商品从购物车中移除
  • 下单
  • 退出程序

5.ShoppingCart类(购物车类)

概述:一个名为ShoppingCart的Java类,表示购物车对象。

属性:

1.itemList:一个私有属性,是一个`List`类型,用于存储购物车中的商品条目对象(ItemEntry)的列表。

方法:

1.ShoppingCart()构造方法:初始化购物车对象,创建了一个空的商品条目列表。
2.calculateTotalPrice()方法:计算购物车中商品的总价的方法,遍历购物车中的商品条目,将各个商品的价格和数量相乘,并将它们相加以计算总价。
3.addItem(Commodity commodity, int quantity)方法:向购物车中添加商品的方法。用户可以指定要添加的商品和数量。如果购物车中已存在相同的商品,则增加其数量;否则创建一个新的商品条目。
4.remove(Integer id)方法:从购物车中移除指定的商品的方法。用户可以指定要移除的商品的编号(id)。如果成功移除,则返回true;否则返回false。
5.findById(Integer id)方法:查找购物车中指定商品编号的商品条目的索引。如果找到,返回索引;否则返回-1。
6.displayItems()方法:显示购物车中的商品条目的方法,遍历购物车中的商品条目并将它们打印出来。
7.ItemEntry内部类:表示购物车中的商品条目对象。包括商品对象、数量等属性,以及相应的获取和设置方法。

五.本系统体现的面向对象的封装性

这个系统利用面向对象的封装原则,通过类的设计和属性与方法的封装,提高了代码的可维护性和扩展性。在购物车系统中,属性被私有化,只能通过类的方法访问和修改,确保数据的有效性和一致性,同时提供对外接口,不需了解内部实现细节即可调用。

六.项目包结构(package的划分)与关键代码

1.项目的包结构

项目的包结构(为什么要这样设计包结构?)

这样设计包结构可以方便我们针对不同类进行修改,更好地管理项目,让程序具有更高的可读性。

2.主要功能

部分功能流程图

(1)往购物车中添加商品

(2)将购物车中的商品移除

关键代码

(1)Main类
package shopping;
import java.util.*;
public class Main {

	public static void main(String[] args) {
		ShoppingCart shoppingcart=new ShoppingCart();
		Mall mall=new Mall();
		mall.initCommodities();
		Menu menu=new Menu();
		while(true) {
			menu.show();
			Scanner sc=new Scanner(System.in);
			String  choice=sc.next();
			switch (choice) {
			case "1":
				DisplayAllCommodities(mall);
				break;
			case"2":
				SearchCommodity(mall);
				break;
			case"3":
				AddToCart(mall,shoppingcart);
				break;
			case"4":
				DisplayCart(shoppingcart);
				break;
			case"5":
				removeFromCart(shoppingcart);
				break;
			case"6":
				CaculateOrder(shoppingcart);
				break;
			case"7":
				System.out.println("感谢您的使用,再见!");
			default:
				System.out.println("您输入的数字不符合规范,请重新输入");
				break;
			}
		
		}
	}
	public static void AddToCart(Mall mall,ShoppingCart shoppingcart)
	{
		Scanner sc = new Scanner(System.in);
        System.out.println("请输入要添加的商品编号:");
        int id = sc.nextInt();
        System.out.println("请输入要添加的商品数量:");
        int quantity = sc.nextInt();

        Commodity commodity = mall.findCommodityById(id);
        if (commodity != null) {
            shoppingcart.addItem(commodity, quantity);
            System.out.println("成功添加商品到购物车。");
        } else {
            System.out.println("未找到该商品。");
        }
		
	}
	public static void DisplayAllCommodities(Mall mall)
	{
		List<Commodity>commodities=mall.getAllCommodities();
		 for (Commodity commodity : commodities) {
	            System.out.println(commodity);
	        }
	}
	public static void SearchCommodity(Mall mall)
	{
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入要查找的商品编号");
		int id= sc.nextInt();
		Commodity item=mall.findCommodityById(id);
		if(item!=null)
		{
			System.out.println(item);
		}else 
		{
			System.out.println("未找到该商品");
		}
	}
	public static void DisplayCart(ShoppingCart shoppingcart)
	{
		shoppingcart.displayItems();
	}
	public static void removeFromCart(ShoppingCart shoppingcart) {
	    Scanner sc = new Scanner(System.in);
	    System.out.println("请输入要移除的商品编号:");
	    int id = sc.nextInt();

	    int index = shoppingcart.findById(id);
	    if (index != -1) {
	        shoppingcart.remove(index);
	        System.out.println("成功移除商品。");
	    } else {
	        System.out.println("商品不存在于购物车中。");
	    }
	}
	public static void CaculateOrder(ShoppingCart shoppingcart)
	{
		System.out.println("购物清单总价格位:");
		shoppingcart.calculateTotalPrice();
	}
    	
}


(2)Menu类
package shopping;

import java.util.Scanner;

public class Menu {
	public void show() {
		System.out.println("*******************欢迎来到什么都有超市*****************");
		System.out.println("\t(1)展示所有商品");
		System.out.println("\t(2)根据编号查找商品");
		System.out.println("\t(3)添加商品到购物车");
		System.out.println("\t(4)查看购物车");
		System.out.println("\t(5)将商品从购物车中移除");
		System.out.println("\t(6)下单");
		System.out.println("\t(7)退出程序");
		System.out.println("***********************************************");
	}
}
(3)Mall类
package shopping;
import java.util.ArrayList;
import java.util.List;

public class Mall {
    private List<Commodity> commodities;

    public Mall() {
        commodities = new ArrayList<>();
    }

    public void initCommodities() {
        Commodity c1 = new Commodity(1, "牛奶", 10.5);
        Commodity c2 = new Commodity(2, "西瓜", 10.5);
        Commodity c3 = new Commodity(3, "手机", 25.99);
        Commodity c4 = new Commodity(4, "充电器", 8.88);
        Commodity c5 = new Commodity(5, "小米", 4.26);
        Commodity c6 = new Commodity(6, "花生", 3.99);
        Commodity c7 = new Commodity(7, "牛奶", 32.00);
        Commodity c8 = new Commodity(8, "洗发水", 23.88);
        Commodity c9 = new Commodity(9, "锅", 55.03);
        Commodity c10 = new Commodity(10, "泡面", 3.5);
        commodities.add(c1);
        commodities.add(c2);
        commodities.add(c3);
        commodities.add(c4);
        commodities.add(c5);
        commodities.add(c6);
        commodities.add(c7);
        commodities.add(c8);
        commodities.add(c9);
        commodities.add(c10);
    }

    public List<Commodity> getAllCommodities() {
        return commodities;
    }

    public Commodity findCommodityById(int id) {
        for (Commodity commodity : commodities) {
            if (commodity.getId() == id) {
                return commodity;
            }
        }
        return null;
    }
    public List<Commodity> getCommodities() {
        return commodities;
    }
}
(4)Commodity类
package shopping;

import java.util.ArrayList;
import java.util.List;

public class Commodity {
	private Integer id;
	private String name;
	private Double price;

	public Commodity() {
	}

	public Commodity(Integer id, String name, Double price) {
		this.id = id;
		this.name = name;
		this.price = price;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Double getPrice() {
		return price;
	}

	public void setPrice(Double price) {
		this.price = price;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) { 
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Commodity other = (Commodity) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "编号=" + id + ", 商品=" + name + ", 价格=" + price + "]";
	}

}
(5)ShoppingCart类
package shopping;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

public class ShoppingCart {
    private List<ItemEntry> itemList;

    public ShoppingCart() {
        itemList = new ArrayList<>();
    }

    /**
     * 计算购物车中商品的总价
     * @return 总价
     */
    public BigDecimal calculateTotalPrice() {
        BigDecimal totalPrice = BigDecimal.ZERO;// 初始化总价为0
        for (ItemEntry itemEntry : itemList) {
        	BigDecimal itemPrice = new BigDecimal(Double.toString(itemEntry.item.getPrice()));
            int quantity = itemEntry.getQuantity();
            BigDecimal itemTotalPrice = itemPrice.multiply(BigDecimal.valueOf(quantity));
            totalPrice = totalPrice.add(itemTotalPrice);
        }
        return totalPrice;
    }

    /**
     * 向购物车中添加商品
     * @param commodity 要添加的商品
     * @param quantity 商品数量
     */
    public void addItem(Commodity commodity, int quantity) {
        if (commodity == null || quantity <= 0) {
            return;
        }
        for (ItemEntry itemEntry : itemList) {
            if (itemEntry.getItem().equals(commodity)) {
                itemEntry.setQuantity(itemEntry.getQuantity() + quantity);
                return;
            }
        }
        itemList.add(new ItemEntry(commodity, quantity));
    }

    /**
     * 从购物车中移除指定的商品
     * @param commodity 要移除的商品
     * @return 如果成功移除则返回 true,否则返回 false
     */
    public boolean remove(Integer id) {
		if (id == null)
			return false;
		int index = findById(id);
		if (index == -1) { // 未找到
			return false;
		} else {
			ItemEntry entry = itemList.get(index);
			if (entry.getQuantity() <= 1) {// 当条目数量<1则删除条目
				itemList.remove(index);
			} else {
				entry.decrease();
			}
		}
		return true;
	}

    int findById(Integer id) {
		for (int i = 0; i < itemList.size(); i++) {
			if (itemList.get(i).getItem().getId().equals(id))
				return i;
		}
		return -1;
	}

	/**
     * 显示购物车中的商品条目
     */
    public void displayItems() {
        for (ItemEntry itemEntry : itemList) {
            System.out.println(itemEntry);
        }
    }

    /**
     * 购物车中的商品条目类
     */
    private class ItemEntry {
        private Commodity item;
        private int quantity;

        public ItemEntry(Commodity item, int quantity) {
            this.item = item;
            this.quantity = quantity;
        }

        public Commodity getItem() {
            return item;
        }

        public void decrease() {
        	quantity--;
		}
        public void setQuantity(int quantity) {
        	this.quantity = quantity;
        }
        public int getQuantity() {
            return quantity;
        }
        public String toString() {
            return "商品信息:[编号=" + item.getId() + ", 名称=" + item.getName()
                    + ", 价格=" + item.getPrice() + ",数量=" + quantity + "]";
        }
    }

    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值