第1次任务:购物车程序的面向对象设计-修改版

小组分工

任务 姓名
面向对象设计、功能设计、博客制作 郭宇豪
前期调查、编码规范 黄常奇

1.前期调查

京东商城中的购物车

在这里插入图片描述

购物车最主要的功能为商品条目显示、商品小计、商品数量累加、商品单价显示、商品总价,附加功能为用户登录和结账。

编码规范

代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,即使纯拼音命名方式也要避免采用。
正例: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、类名为 essageUtils(此规则参考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。

2.系统功能结构图

在这里插入图片描述

3.系统描述

首先打开系统应先进入用户登录模块输入账号密码用以登录 ,登陆后展现入功能列表,然后展示商品名称和单价,其次要能输入商品序号数量,再而应当能实现向购物车内增添商品,从购物车里删减商品,对购物车内商品进行小计和购物车内商品总价的计算清空购物车功能,再后需要能实现结账功能,最后要能实现退出购物车功能。

4.UML类图

在这里插入图片描述

5.封装性体现

商品信息是商品的基本属性,储存在文本信息中,在本程序的运行过程中无法更改。
此外还有用户的账户密码也是文本信息,无法更改;而支付密码为private型亦无法更改。
在这里插入图片描述
再者就是Cart类中的一些不可更改的属性。

6.项目包结构与代码展示及操作实例

项目包结构:

Shopping Cart.shoppingcart.Menu
Shopping Cart.shoppingcart.Cart
Shopping Cart.shoppingcart.Goods
Shopping Cart.shoppingcart.UserOrder
Shopping Cart.shoppingcart.Buy
设计目的:合理的功能划分以便于管理,以较完备的面向对象设计来实现购物车的主要功能和附加功能。

代码展示与操作实例:

代码展示

UserOrder类

package shoppingcart;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;

public class UserOrder {
    
    
	public static  String str1 = null;
	public static  String str2= null;
	public static int index1=0;
	public static int index2=0;
	public static void accountNumber(String ia) throws Exception {
    
    
        File file = new File("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\useraccount.txt");//定义一个file对象,用来初始化FileReader
        FileReader reader = new FileReader(file);//定义一个fileReader对象,用来初始化BufferedReader
        BufferedReader bReader = new BufferedReader(reader);//new一个BufferedReader对象,将文件内容读取到缓存
        StringBuilder sb = new StringBuilder();//定义一个字符串缓存,将字符串存放缓存中
        String s1 = "";
        while ((s1 =bReader.readLine()) != null) {
    
    //逐行读取文件内容,不读取换行符和末尾的空格
            sb.append(s1);//将读取的字符串添加换行符后累加存放在缓存中
           // System.out.println(s);
        }
        bReader.close();
         str1 = sb.toString();
         
         if(str1.equals(ia)) {
    
    
        	 
        	 index1=1;
         }
         else {
    
    
        	 index1=0;
         }
		
	}
	public static void passwordNumber(String ip) throws Exception {
    
    
        File file = new File("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\userpassword.txt");//定义一个file对象,用来初始化FileReader
        FileReader reader = new FileReader(file);//定义一个fileReader对象,用来初始化BufferedReader
        BufferedReader bReader = new BufferedReader(reader);//new一个BufferedReader对象,将文件内容读取到缓存
        StringBuilder sb = new StringBuilder();//定义一个字符串缓存,将字符串存放缓存中
        String s2 = "";
        while ((s2 =bReader.readLine()) != null) {
    
    //逐行读取文件内容,不读取换行符和末尾的空格
            sb.append(s2);//将读取的字符串添加换行符后累加存放在缓存中
           // System.out.println(s);
        }
        bReader.close();
         str2 = sb.toString();
         if(str2.equals(ip)) {
    
    
        	 index2=1;
         }
         else {
    
    
        	 index2=0;
         }

		
	}
	

	

}


Goods类

package shoppingcart;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Goods {
    
    
	public static void showGoodsItems() throws IOException{
    
    
		FileReader fr = new FileReader("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\goods.txt");
		BufferedReader br = new BufferedReader(fr);
		while(br.ready()){
    
    
			System.out.println(br.readLine());
		}//输出商品列表
	}
}

Cart类

package shoppingcart;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.text.DecimalFormat;
import java.util.Scanner;
import javax.swing.JOptionPane;


class Cart {
    
    
	private int[] number = {
    
    6661,6662,6663,6664};	
	private String tempnumber0=new String("6661");
	private String tempnumber1=new String("6662");
	private String tempnumber2=new String("6663");
	private String tempnumber3=new String("6664");
	private String tempprice0=new String("8881");
	private String tempprice1=new String("8882");
	private String tempprice2=new String("8883");
	private String tempprice3=new String("8884");
	private String temptotal=new String("886"); 
	 String sum = "666";
	//构建购物车内的商品数组

	public  void showCartItems() throws IOException{
    
    
		FileReader fr = new FileReader("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt");
		BufferedReader br = new BufferedReader(fr);
		while(br.ready()){
    
    
			System.out.println(br.readLine());
		}//输出购物车中的内容
	}
	
	public  void add(int i,int addnumber) {
    
    
		switch(i) {
    
    
		case 0:{
    
    
			number[i]+=addnumber;
			String numberstr=Integer.toString(number[i],10);
			modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt",tempnumber0,numberstr);
			String tempnumber0=Integer.toString(number[i],10);
			System.out.println();
		
		}
		break;
		case 1:{
    
    
			number[i]+=addnumber;
			String numberstr=Integer.toString(number[i],10);
			modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt",tempnumber1,numberstr);
			String tempnumber1=Integer.toString(number[i],10);
			System.out.println();
			
		}
		break;	
        case 2:{
    
    
        	number[i]+=addnumber;
			String numberstr=Integer.toString(number[i],10);
			modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt",tempnumber2,numberstr);
			String tempnumber2=Integer.toString(number[i],10);
			System.out.println();
			
		}
		break;
        case 3:{
    
    
        	number[i]+=addnumber;
			String numberstr=Integer.toString(number[i],10);
			modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt",tempnumber3,numberstr);
			String tempnumber3=Integer.toString(number[i],10);
			System.out.println();
			
		}
		break;	
		}
   onePrice(i);
   sumPrice();
		
	}//添加对应商品


	public void delete(int j,int deletenumber) {
    
    
		number[j]-=deletenumber;
		if(number[j]<=0) {
    
    
			switch(j) {
    
    
			case 0:{
    
    
				modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt","缎面毛绒玩具狗(MINISO褐色大号)","");
			modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt",tempnumber0,"");
			modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt",tempprice0+"元","");
			}
			break;
			case 1:{
    
    
				modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt","HUAWEI P50(曜金黑 8+128G)","");
				modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt",tempnumber1,"");
				modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt",tempprice1+"元","");
				
			}
			break;
			case 2:{
    
    
				modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt","LOCK&LOCK塑料水杯(黑色19款) ","");
				modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt",tempnumber2,"");
				modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt",tempprice2+"元","");
				
			}
			break;
			case 3:{
    
    
				modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt"," 黄金搭档金维他含片(100片装)","");
				modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt",tempnumber3,"");
				modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt",tempprice3+"元","");
			}
			break;
			}
				
		}
		else {
    
    
			switch(j) {
    
    
			case 0:{
    
    
				number[j]-=deletenumber;
				String numberstr=Integer.toString(number[j],10);
				modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt",tempnumber0,numberstr);
				String tempnumber0=Integer.toString(number[j],10);
				System.out.println();
			
			}
			break;
			case 1:{
    
    
				number[j]-=deletenumber;
				String numberstr=Integer.toString(number[j],10);
				modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt",tempnumber1,numberstr);
				String tempnumber1=Integer.toString(number[j],10);
				System.out.println();
				
			}
			break;	
	        case 2:{
    
    
	        	number[j]-=deletenumber;
				String numberstr=Integer.toString(number[j],10);
				modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt",tempnumber2,numberstr);
				String tempnumber2=Integer.toString(number[j],10);
				System.out.println();
				
			}
			break;
	        case 3:{
    
    
	        	number[j]-=deletenumber;
				String numberstr=Integer.toString(number[j],10);
				modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt",tempnumber3,numberstr);
				String tempnumber3=Integer.toString(number[j],10);
				System.out.println();
				
			}
	        break;
			}
	}
		
		onePrice(j);
		sumPrice();
		
		
} //删除特定商品的方法
	
	public void clearOut() throws IOException {
    
    
	       BufferedWriter clearout = new BufferedWriter(new FileWriter("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt"));
	       clearout.write("");
	       clearout.flush();
	       clearout.close();
	   }
	//清空购物车的方法


	
	public void sumPrice() {
    
    
		
		double s=number[0]*30.00+number[1]*4488.00+number[2]*25.50+number[3]*129.99;
		DecimalFormat format = new DecimalFormat("#.00");
		sum= format.format(s);
		modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt",temptotal,sum);
		temptotal=sum;
		
	}//计算总价
	
	public void onePrice(int k) {
    
    
		switch(k)
		{
    
    
		case 0:{
    
    
			double oneoneprice=number[0]*30.00;
			DecimalFormat format = new DecimalFormat("#.00");
			String sum0= format.format(oneoneprice);
			modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt",tempprice0,sum0);
			tempprice0=sum0;
			
		}
		break;
		case 1:{
    
    
			double twooneprice=number[1]*4488.00;
			DecimalFormat format = new DecimalFormat("#.00");
			String sum1= format.format(twooneprice);
			modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt",tempprice1,sum1);
			tempprice1=sum1;
			
		}
		break;
		case 2:{
    
    
			double threeoneprice=number[2]*25.50;
			DecimalFormat format = new DecimalFormat("#.00");
			String sum2= format.format(threeoneprice);
			modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt",tempprice2,sum2);
			tempprice2=sum2;
			
		}
		break;
		case 3:{
    
    
			double fouroneprice=number[3]*129.99;
			DecimalFormat format = new DecimalFormat("#.00");
			String sum3= format.format(fouroneprice);
			modifyFileContent("D:\\大二上\\JAVA\\eclipse项目\\Shopping Cart\\src\\cart.txt",tempprice3,sum3);
			tempprice3=sum3;
			
		}
		break;
		}		
	}//计算每个商品的小计
	
//文件修改的基本方法
private static boolean modifyFileContent(String fileName, String oldstr, String newStr) {
    
    
	RandomAccessFile raf = null;
	try {
    
    
		raf = new RandomAccessFile(fileName, "rw");
		String line = null;
		// 记住上一次的偏移量
		long lastPoint = 0;
		while ((line = raf.readLine()) != null) {
    
    
			// 文件当前偏移量
			final long ponit = raf.getFilePointer();
			// 查找要替换的内容
			if (line.contains(oldstr)) {
    
    
				String str = line.replace(oldstr, newStr);
				//System.out.println("修改完毕!");
				//System.err.println(str);
				raf.seek(lastPoint);
				raf.writeBytes(str);
			}
			lastPoint = ponit;
			//System.err.println(lastPoint);
		}
	} catch (Exception e) {
    
    
		e.printStackTrace();
	} finally {
    
    
		try {
    
    
			raf.close();
		} catch (IOException e) {
    
    
			e.printStackTrace();
		}
	}
	return true;
  }

}


Buy类

package shoppingcart;

import javax.swing.JOptionPane;

public class Buy {
    
    
	Cart cart=new Cart();
	private static String  crypto = "Gyh2002";
	public void buy() {
    
    
		
		//输入对话框
		String x = JOptionPane.showInputDialog("请输入结算密码:");
		while(true) {
    
    
		if(crypto.equals(x)) {
    
    
			JOptionPane.showMessageDialog(null, "密码正确!");
			break;
		}

		else {
    
    
			JOptionPane.showMessageDialog(null, "密码错误!请重试!");
			 break;
		}
		}
		//选择对话框:获得用户的选择结果
		int choice = JOptionPane.showConfirmDialog(null, "共计0元 是否支付?");
		System.out.println("choice"+choice);
		switch(choice){
    
    
		case JOptionPane.YES_OPTION:{
    
    
			System.out.println("yes");
			JOptionPane.showMessageDialog(null, "支付成功!");
		}
		break;
		case JOptionPane.NO_OPTION:{
    
    
			System.out.println("no");
			JOptionPane.showMessageDialog(null, "支付失败!");
		}
		break;
		case JOptionPane.CANCEL_OPTION:{
    
    
			System.out.println("cancle");
			JOptionPane.showMessageDialog(null, "用户取消支付!");
		}
		break;
		}

System.exit(1);
	}

}

操作实例

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
容错性测试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

7.总结和反思

本次修改较初版有较大的提升,封装性得到了很大的增强,亮点是主要功能以文本操作实现,附加功能实现了界面对话框设计。不足之处在于bug过多,debug时长甚至比编写时常还长,编程能力仍有待提升。

猜你喜欢

转载自blog.csdn.net/qq_51726651/article/details/120644759