小组成员:
徐佳澎、陈俊威
任务分配
任务 | 成员 |
---|---|
前期调查、博客制作、面向对象设计、功能设计、 | 陈俊威 |
面向对象设计、功能设计、编码规范、 | 徐佳澎 |
1.前期调查
本次任务要求掌握继承与多态、掌握DAO模式。
使用子类与继承体现不同商品的特性
网上商城不同类别的商品有一些共同信息,比如商品名、价格。但有的信息并不相同。比如,书本还要显示出版信息(出版社、ISBN、作业),电脑要显示厂商、规格等信息。设计显示不同商品的页面,可根据商品的类别显示不同的信息。
尝试使用DAO模式
商城可能使用文件存储商品数据、也可能使用列表存储数据。尝试使用DAO模式实现此功能,使得涉及到存储相关的代码可以轻松在两种存储模式之间进行切换。
2.编码规范
代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。
说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,即使纯拼音命名方式
也要避免采用。
正例: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("请选择功能:");
}
}