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

本文探讨了如何通过继承和多态实现不同商品类型特性的展示,结合DAO模式在商城数据存储中的灵活性。团队成员徐佳澎负责面向对象设计、编码规范及功能设计,陈俊威负责前期调查、面向对象设计和功能实现。内容涉及商品类设计、购物车功能、编码规范以及DAO接口的使用,展示了如何在文件和列表存储间切换数据结构。
摘要由CSDN通过智能技术生成

小组成员:

徐佳澎、陈俊威

任务分配

任务成员
前期调查、博客制作、面向对象设计、功能设计、陈俊威
面向对象设计、功能设计、编码规范、徐佳澎

1.前期调查

本次任务要求掌握继承与多态、掌握DAO模式。

使用子类与继承体现不同商品的特性

网上商城不同类别的商品有一些共同信息,比如商品名、价格。但有的信息并不相同。比如,书本还要显示出版信息(出版社、ISBN、作业),电脑要显示厂商、规格等信息。设计显示不同商品的页面,可根据商品的类别显示不同的信息。在这里插入图片描述

尝试使用DAO模式

商城可能使用文件存储商品数据、也可能使用列表存储数据。尝试使用DAO模式实现此功能,使得涉及到存储相关的代码可以轻松在两种存储模式之间进行切换。

2.编码规范

阿里巴巴Java开发手册 终极版(1.3.0)

代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。

说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,即使纯拼音命名方式
也要避免采用。
正例:alibaba / taobao / youku / hangzhou 等国际通用的名称,可视同英文。
反例:DaZhePromotion [打折] / getPingfenByName() [评分] / int 某变量 = 3

类名使用 UpperCamelCase 风格,必须遵从驼峰形式,但以下情形例外:DO / BO /

DTO / VO / AO
正例:MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion
反例:macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion

方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵从驼峰形式。

正例: localValue / getHttpMessage() / inputUserId

包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。

正例: 应用工具类包名为 com.alibaba.open.util、类名为 MessageUtils(此规则参考
spring 的框架结构)

各层命名规约:

A) Service/DAO 层方法命名规约
1) 获取单个对象的方法用 get 做前缀。
2) 获取多个对象的方法用 list 做前缀。
3) 获取统计值的方法用 count 做前缀。
4) 插入的方法用 save/insert 做前缀。
5) 删除的方法用 remove/delete 做前缀。
6) 修改的方法用 update 做前缀。
B) 领域模型命名规约
1) 数据对象:xxxDO,xxx 即为数据表名。
2) 数据传输对象:xxxDTO,xxx 为业务领域相关的名称。
3) 展示对象:xxxVO,xxx 一般为网页名称。
4) POJO 是 DO/DTO/BO/VO 的统称,禁止命名成 xxxPOJO。

面向对象设计

商品类的设计

父类Commodity,父类Commmodity具有所有商品共有的属性,例如商品的编号、商品的名称以及商品的单价。
子类Foods继承自父类Commmodity,Foods具有特有的属性重量weight。
子类Electronic继承自父类Commmodity,Electronic具有特有的属性尺寸size、品牌brand和配置configuration。
子类Books继承自父类Commmodity,Books具有特有的属性作者writer、出版社publisher。
子类Clothes继承自父类Commmodity,Clothes具有特有的属性颜色color。
子类Toiletries继承自父类Commmodity,Toiletries具有属性品牌。
子类全都继承父类的tostring方法,方便展示商城和购物的信息。

购物车类的设计

购物车的功能要有添加商品、删除商品、修改商品条目、清空购物车、展示购物车中的内容。有时为了方便用户,在用户保存购物车后,购物车中的商品信息在下一次使用购物车时还能显示,因此设计购物车保存功能。
购物车中的信息以Arraylist的形式储存。保存购物将购物车中的信息打印到txt文件中。

商城类的设计(DAO模式)

商城可能使用文件存储商品数据、也可能使用列表存储数据。使用DAO接口令商城数据的储存在列表和文件之间切换。
为了方便购物车功能的实现,商城类中添加从商城中取得商品、判断商城中是否有某商品的功能。

功能结构图

在这里插入图片描述

UML类图

在这里插入图片描述

关键包结构与代码

Commodity类,同时包含了五个商品子类

public class Commodity {
	private String serialnumber;
	private String name;
	private String price;
	
	public Commodity(String serialnumber, String name, String price) {
		super();
		this.serialnumber = serialnumber;
		this.name = name;
		this.price = price;
	}
	public String getSerialnumber() {
		return serialnumber;
	}
	public void setSerialnumber(String serialnumber) {
		this.serialnumber = serialnumber;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPrice() {
		return price;
	}
	public void setPrice(String price) {
		this.price = price;
	}
	@Override
	public String toString() {
		return "编号-"+serialnumber+" 商品名-"+name+" 价格-"+price+" ";
	}
}
class Foods extends Commodity{
	
	
	public Foods(String serialnumber, String name, String price, String weight) {
		super(serialnumber, name, price);
		this.weight = weight;
	}


	private String weight;

	public String getWeight() {
		return weight;
	}

	public void setWeight(String weight) {
		this.weight = weight;
	}

	@Override
	public String toString() {
		return super.toString()+"重量:"+weight;
	}
	
}
class Electronic extends Commodity{
	
	private String size;
	private String brand;
	private String configuration;
	public Electronic(String serialnumber, String name, String price, String size, String brand, String configuration) {
		super(serialnumber, name, price);
		this.size = size;
		this.brand = brand;
		this.configuration = configuration;
	}
	public String getSize() {
		return size;
	}
	public void setSize(String size) {
		this.size = size;
	}
	public String getBrand() {
		return brand;
	}
	public void setBrand(String brand) {
		this.brand = brand;
	}
	public String getConfiguration() {
		return configuration;
	}
	public void setConfiguration(String configuration) {
		this.configuration = configuration;
	}
	@Override
	public String toString() {
		return super.toString()+"品牌-"+brand+" 规格-"+size+" 配置-"+configuration;
	}
	
	
}
class Books extends Commodity{
	
	public Books(String serialnumber, String name, String price, String writer, String publisher) {
		super(serialnumber, name, price);
		this.writer = writer;
		this.publisher = publisher;
	}
	private String writer;
	private String publisher;
	public String getWriter() {
		return writer;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}
	public String getPublisher() {
		return publisher;
	}
	public void setPublisher(String publisher) {
		this.publisher = publisher;
	}
	@Override
	public String toString() {
		return super.toString()+"作者-"+writer+" 出版社-"+publisher;
	}
	
}
class Clothes extends Commodity{
	
	public Clothes(String serialnumber, String name, String price, String color) {
		super(serialnumber, name, price);
		this.color = color;
	}
	private String color;
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	@Override
	public String toString() {
		return super.toString()+"颜色-"+color;
	}
	
}
class Toiletries extends Commodity{
	private String brand;

	public Toiletries(String serialnumber, String name, String price, String brand) {
		super(serialnumber, name, price);
		this.brand = brand;
	}

	@Override
	public String toString() {
		return super.toString()+"品牌-"+brand;
	}
	
	
}

ShoppingCenterDao接口

public interface ShoppingCenterDao {
	public int HaveCommodity(String serialnumber);
	public void showShoppingcenter();
	public Commodity getCommodity(String serialnumber);
}

以txt形式储存商城信息

package Item;

import java.io.*;

public class ShoppingCentertxt implements ShoppingCenterDao {
	String filepath = "C:\\shoppingcart\\shoppingcenter.txt";

	@Override
	public int HaveCommodity(String serialnumber) {
		try {
			BufferedReader in = new BufferedReader(new FileReader(filepath));
			String temp;
			String[] strs;
			while ((temp = in.readLine()) != null) {
				serialnumber = serialnumber;
				strs = temp.split(" ");
				if (strs[0].equals(serialnumber))
					return 1;
			}
		} catch (IOException e) {
		}
		return -1;
	}

	@Override
	public void showShoppingcenter() {
		System.out.println("-------------------商城-------------------");
		try {
			BufferedReader in = new BufferedReader(new FileReader(filepath));
			String temp;
			while ((temp = in.readLine()) != null) {
				System.out.println("编号-"+temp);
			}
		} catch (IOException e) {
		}
		System.out.println("------------------------------------------");
	}

	@Override
	public Commodity getCommodity(String serialnumber) {
		try {
			BufferedReader in = new BufferedReader(new FileReader(filepath));
			String temp;
			String[] str;
			serialnumber = serialnumber;
			while ((temp = in.readLine()) != null) {
				str = temp.split(" ");
				if (str[0].equals(serialnumber)) {
					String type = serialnumber.substring(0, 1);
					switch (type) {
					case "F": {
						Commodity commodity = new Foods(str[0], str[1], str[2], str[3]);
						return commodity;
					}
					case "I": {
						Commodity commodity = new Electronic(str[0], str[1], str[2], str[3], str[4], str[5]);
						return commodity;
					}
					case "B": {
						Commodity commodity = new Books(str[0], str[1], str[2], str[3], str[4]);
						return commodity;
					}
					case "C": {
						Commodity commodity = new Clothes(str[0], str[1], str[2], str[3]);
						return commodity;
					}
					case "T": {
						Commodity commodity = new Toiletries(str[0], str[1], str[2], str[3]);
						return commodity;
					}
					}
				}
			}
		} catch (IOException e) {
		}
		//Commodity commodity = new Toiletries("T005", "云南白药牙膏薄荷味", "30.90", "云南白药");
		return null;
	}
	
}

以Arraylist储存商城信息

package Item;

import java.util.ArrayList;

public class ShoppingCenter implements ShoppingCenterDao {
	private ArrayList<Commodity> list = new ArrayList<>();

	public ArrayList<Commodity> getShoppingcenter() {
		return this.list;
	}

	{
		// 为商场中添加商品
		list.add(new Foods("F001", "德芙巧克力", "16.00", "300克"));
		list.add(new Electronic("I002", "联想IdeaPad14s", "3799.00", "14.英寸", "联想", "i3-1005G1 8G 256G固态硬盘"));
		list.add(new Books("B003", "JAVA学习笔记", "36.90", "林信良", "清华大学出版社"));
		list.add(new Clothes("C004", "冬季男装", "89.00", "黑色"));
		list.add(new Toiletries("T005", "云南白药牙膏薄荷味", "30.90", "云南白药"));
	}

	public int HaveCommodity(String serialnumber) {// 判断商场中有没有该商品
		for (int i = 0; i < list.size(); i++) {
			if (list.get(i).getSerialnumber().equals(serialnumber)) {
				return i;
			}
		}
		return -1;
	}

	public void showShoppingcenter() {
		System.out.println("-------------------商城-------------------");
		for (Commodity e : list) {
			System.out.println(e.toString());
		}
		System.out.println("------------------------------------------");
	}

	public Commodity getCommodity(String serialnumber) {
		int i=0;
		for (i=0;i<list.size();i++){
			if(list.get(i).getSerialnumber().equals(serialnumber))
			break;
		}
		return list.get(i);
	}
}

ShoppingCart类实现购物车功能

package Item;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;

import java.util.Scanner;

public class ShoppingCart {
	ShoppingCenter center = new ShoppingCenter();
	ArrayList<Commodity> cartitem = new ArrayList<>();
	HashMap<Object, Object> serialmap = new HashMap<Object, Object>();

	public ArrayList<Commodity> getCartItem() {
		return this.cartitem;
	}

	public int haveItem(String serialname) {
		for (int i = 0; i < cartitem.size(); i++) {
			if (cartitem.get(i).getSerialnumber().equalsIgnoreCase(serialname))
				return i;
		}
		return -1;
	}

	public void addItem(Commodity item, int number) {
		cartitem.add(item);
		// serialmap.put(item.getSerialnumber(), number);
		serialmap.put(item.getSerialnumber(), number);
		System.out.println("成功加入购物车!");
	}

	public void removeItem(String serialnumber) {
		for(int i=0;i<cartitem.size();i++)
			if(cartitem.get(i).getSerialnumber().equals(serialnumber))
				cartitem.remove(i);
		if (serialmap.containsKey(serialnumber))
			serialmap.remove(serialnumber);
		System.out.println("成功移除商品!");
	}

	public void showCart() {
		System.out.println("******************购物车******************");

		BigDecimal sum = new BigDecimal(0.0);
		if (serialmap.isEmpty()) {
			System.out.println("总价:" + sum);
			return;
		} else {
			for (Commodity e : cartitem) {
				//System.out.println(serialmap.get(e.getSerialnumber()));
				//System.out.println();
					int number =(int) serialmap.get(e.getSerialnumber());
					BigDecimal num = new BigDecimal(number);
					BigDecimal price = new BigDecimal(e.getPrice());
					BigDecimal itemsum = num.multiply(price);
					sum = sum.add(itemsum);
					System.out.println(e.toString() + " 数量:" + number + " 小计:" + num.multiply(price));
			    
			}
			System.out.println("总价:" + sum);
			System.out.println("******************************************");
		}

	}

	public void modifyCart(String serialname) {
		if (serialmap.containsKey(serialname)) {
			System.out.println("请输入新的数量:");
			Scanner in = new Scanner(System.in);
			int number = in.nextInt();
			if (number == 0) {
				System.out.println("数量不能为0!");
				return;
			}
			serialmap.put(serialname, number);
			System.out.println("修改成功!");
		} else
			System.out.println("购物车中无该商品");
	}

	public void printcartTxt() {

		try {
			File file = new File("C:\\shoppingcart\\cart.txt");
			FileWriter fileWriter = new FileWriter(file);
			fileWriter.write("");
			fileWriter.flush();
			fileWriter.close();
			BufferedWriter out = new BufferedWriter(new FileWriter("C:\\shoppingcart\\cart.txt"));
			for (HashMap.Entry<Object, Object> entry : serialmap.entrySet()) {
				out.write(entry.getKey() + " " + entry.getValue() + "\r\n");
			}
			out.close();

		} catch (IOException ioe) {
			ioe.printStackTrace();
		}
		System.out.println("保存成功!");

	}

	public void readcartTxt() {

		try {
			BufferedReader in = new BufferedReader(new FileReader("C:\\shoppingcart\\cart.txt"));
			String temp;
			String[] str;
			while ((temp = in.readLine()) != null) {
				str = temp.split(" ");
				int num = Integer.parseInt(str[1]);
				int index = center.HaveCommodity(str[0]);
				addItem(center.getShoppingcenter().get(index), num);

			}
		} catch (IOException e) {
		}

	}

	public void clearCart() {
		cartitem.clear();
		serialmap.clear();
		System.out.println("清空成功!");
	}
}

测试代码

package Item;

import java.util.*;

public class Main {
	public static void main(String[] args) {

		//ShoppingCenter a = new ShoppingCenter();
		ShoppingCenterDao a = new ShoppingCentertxt();
		ShoppingCart cart = new ShoppingCart();
		// ShoppingCartDao cart = new ShoppingCartxt();
		a.showShoppingcenter();
		cart.readcartTxt();
		printMune();
		Scanner in = new Scanner(System.in);
		while (in.hasNext()) {
			String choise = in.next();
			if (choise.equals("7")) {
				System.out.println("成功退出!");
				break;
			}

			switch (choise) {
			case "1": {
				System.out.print("请输入商品编号:");
				String serialnumber = in.next();
				int index = a.HaveCommodity(serialnumber);
				int cartindex = cart.haveItem(serialnumber);
				if (index != -1 && cartindex == -1) {
					int number;
					System.out.print("请输入数量:");
					number = in.nextInt();
					if (number == 0) {
						System.out.println("数量不能为0!");
						System.out.print("请选择功能:");
						break;
					}
					cart.addItem(a.getCommodity(serialnumber), number);
				}

				else if (index == -1)
					System.out.println("商场暂无该商品");
				else if (cartindex != -1)
					System.out.println("购物车中已有该商品");
				System.out.print("请选择功能:");
				break;
			}
			case "2": {
				System.out.print("请输入商品编号:");
				int index;
				String serialnumber = in.next();
				index = cart.haveItem(serialnumber);
				int centerindex = a.HaveCommodity(serialnumber);
				if (index != -1 && centerindex != -1) {
					// int centerindex1=a.HaveCommodity(serialnumber);
					cart.removeItem(serialnumber);// a.getCommodity(serialnumber)
					System.out.print("请选择功能:");
					break;
				}

				else
					System.out.println("购物车中无该商品");
				System.out.print("请选择功能:");
				break;

			}
			case "3": {
				System.out.println("请输入商品编号:");
				String serialnumber = in.next();
				cart.modifyCart(serialnumber);
				System.out.print("请选择功能:");
				break;
			}
			case "4": {
				cart.showCart();
				System.out.print("请选择功能:");
				break;
			}
			case "5": {
				cart.clearCart();
				break;
			}
			case "6": {
				cart.printcartTxt();
				break;
			}
			}
		}

	}

	public static void printMune() {
		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.print("请选择功能:");

	}

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值