修改后的Package名字为com.javaoop1
bean包
package com.javaoop1.bean;import java.util.Objects;/*** @Description: 一个快递包裹类的创建,包含快递单号,快递公司,包裹的取件码* 包含比较快递单号是相同的方法(修改了equals方法)。* @Author: XUEWEN TAN* @Date:2020。08.30* bean这个package中没有任何业务逻辑,所有属性全部私有,提供get,set方法,提供无参构造器的对象。*/public class Express {//快递单号private String number;//快递公司private String company;//取件码private int code;public Express(String number, String company, int code) {this.number = number;this.company = company;this.code = code;}@Overridepublic String toString() {return "Express{" +"number='" + number + '\'' +", company='" + company + '\'' +", code=" + code +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Express express = (Express) o;return Objects.equals(number, express.number);}@Overridepublic int hashCode() {return Objects.hash(number);}public Express() {}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public String getCompany() {return company;}public void setCompany(String company) {this.company = company;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}}
DAO包
package com.javaoop1.dao;import com.javaoop1.bean.Express;import java.util.Random;/***@Description:快递的数据的存储与取出(DAO= data access object),创建一个名为ExpressDao的类,*包含添加快递包裹,生成取件码,查找单号(遍历法),查找取件码(遍历法),update,删除快递包裹,查看所有包裹*@Author: XUEWEN TAN*@Date: 2020.08.30*/public class ExpressDao {//创建一个10*10的快递柜private Express[][] data = new Express [10][];private int size; //定义size作为当前已经存储的快递数量private Random random = new Random();//定义随机数public void init(){for(int i=0;i<10;i++){data[i] = new Express[10];}}public ExpressDao(){init();}/*** 快递员添加快递包裹的方法add* @param e* @return 添加成功或者失败*/public boolean add(Express e){//todo:需要判断e是否为空。if(size == 100){return false;//当存储快递数为100时即快递柜无空位}//随机生成二维数组下标int x = -1;int y = -1;while(true){x = random.nextInt(10);//生成x,y的随机坐标y = random.nextInt(10);if(data[x][y] == null){//此位置无快递break;}}//存入坐标int code =randomCode();e.setCode(code);data[x][y] = e;return true;}/*** 生成六位数取件码* @return Int类型的6位数的取件码*/private int randomCode(){//100000-999999 = 0~899999+100000while(true){int code = random.nextInt(900000) + 100000;//如果查到了快递则继续生成新的取件码Express e = findCode(code);//如果没有查到,则返回生成的取件码,即取件码生成成功if (e == null) {return code;}}}/*** 查找单号-遍历法* @param number* @return 快递包裹(对象)*/public Express findNumber(String number){//todo:在一开始保证入参就是正确的,避免后置校验Express e = new Express();e.setNumber(number);for(int i = 0 ;i<10;i++){for(int j = 0;j<10;j++){if (data[i][j] != null)if (e.equals(data[i][j])){return data[i][j];}}}return null;}/*** 查找取件码-遍历法,小概率事件也需考虑(比如取件码重复)* @param code* @return 快递包裹(对象)*/public Express findCode(int code){for(int i = 0 ;i<10;i++){for(int j = 0;j<10;j++){if (data[i][j] != null)if (data[i][j].getCode() == code){return data[i][j];}}}return null;}/*** 实际上这个update的操作是多余的操作,为了MVC更圆润(演示数据库的实际操作)* @param oldExpress* @param newExpress*/public void update(Express oldExpress,Express newExpress){delete(oldExpress);add(newExpress);}/*** 在快递柜中删除对应的快递包裹信息* @param e*/public void delete(Express e){//命名循环为pp:for(int i = 0 ;i<10;i++) {for (int j = 0; j < 10; j++) {if (e.equals(data[i][j])) {data[i][j] = null;break p;}}}}/*** 查看所有快递* @return 快递柜里的所有东西*/public Express[][] findAll(){return data;}}
Main包
package com.javaoop1.main;import com.javaoop1.bean.Express;import com.javaoop1.dao.ExpressDao;import com.javaoop1.view.Views;/*** @Description:Main这个类是controller模块(MVC中的C模块),包含快递柜程序的控制逻辑,* 初始化主要界面,分流快递员和取件人,即快递员界面和取件人界面* @Author:Xuewen Tan* @Date:2020.08.30*/public class Main {//初始化视图对象private static Views v = new Views();//初始化dao对象private static ExpressDao dao = new ExpressDao();public static void main(String[] args){init();}/*** 初始化方法的定义*/public static void init(){//1. 欢迎v.welcome();m:while(true){//2. 弹出身份选择菜单int menu = v.menu();switch (menu){case 0:break m;//主界面1选项:进入快递员界面case 1:cClient();break;//主界面2选项:进入用户界面case 2:uClient();break ;}}v.bye();}/*** 定义取件人界面的调用逻辑*/public static void uClient(){//todo:判断code合理性//获得用户输入的取件码int code = v.uMenu();//取出快递Express e = dao.findCode(code);if (e == null){v.printNull();}else{v.success();v.printExpress(e);dao.delete(e);//取件人取出快递后,在快递柜中删除该包裹}}/*** 定义快递员界面的调度逻辑*/public static void cClient(){while(true){int menu = v.cMenu();switch(menu){case 0:return;case 1:{//提示输入快递信息Express e = v.insert();//查询快递单号是否已经存储Express e2 = dao.findNumber(e.getNumber());//存储快递if (e2 == null){dao.add(e);v.printExpress(e);break;}else{//单号重复v.expressExist();}}break;case 2:{//快递修改//1.提示输入快递信息String number = v.findByNumber();//2.查找数据Express e =dao.findNumber(number);//todo:findExpressByNumber,避免语义歧义Express e2 = e;//3. 打印快递信息if (e == null){v.printNull();}else{v.printExpress(e);//4. 提示修改v.update(e2);dao.update(e,e2);v.printExpress(e2);}}break;case 3:{//删除快递//1.输入快递单号并查找String number = v.findByNumber();//2.查找快递对象Express e = dao.findNumber(number);if (e == null){v.printNull();}else{v.printExpress(e);int type = v.delete();if(type == 1){dao.delete(e);v.success();}}}break;//查看所有case 4:{Express[][] date = dao.findAll();//todo:改为findAllExpressv.printAll(date);}break;}}}}
View包
package com.javaoop1.view;import com.javaoop1.bean.Express;import java.util.Scanner;/*** @Description:MVC中的V模块,V视图展示(欢迎,菜单,子菜单。。。)* @Author: XUEWEN TAN* @Date: 2020.08.30*/public class Views {private Scanner input = new Scanner(System.in);/*** 欢迎*/public void welcome(){System.out.println("欢迎使用阿巴阿巴快递管理系统");}/*** 再见*/public void bye(){System.out.println("欢迎下次使用");}/*** 主菜单(分流快递员和取件的用户* @return 使用者输入的功能选项-int*/public int menu(){System.out.println("请根据提示输入功能序号");System.out.println("1. 快递管理"); //进入快递员管理界面System.out.println("2. 普通用户"); //进入用户取件界面System.out.println("0. 退出");//所有方法均使用nextLine,不会因为输入产生冲突,//还可以接收各种类型的数据。String text = input.nextLine();int num = -1;try{num = Integer.parseInt(text);}catch (NumberFormatException e){//如果有字符串的错误数据输入,需要考虑;恶意输入}if(num<0 || num>2){System.out.println("输入错误,请重新输入");return menu(); //输入数字不在有效范围内,返回菜单}return num;}/*** 快递员菜单cMenu* @return 快递输入的功能选项-int*/public int cMenu(){System.out.println("请选择功能序号:");System.out.println("1. 快递录入");System.out.println("2. 快递修改");System.out.println("3. 快递删除");System.out.println("4. 查看所有快递");System.out.println("0. 退出");//以上为快递员管理界面String text = input.nextLine();int num = -1;try{//将用户输入的取件码,转换为int数据类型num = Integer.parseInt(text);}catch(NumberFormatException e){}if(num<0 || num>4){System.out.println("输入错误,请重新输入");return cMenu();}//同主界面return num;}/*** 快递员录入快递* @return 包含了快递单号和快递公司的快递对象*/public Express insert(){System.out.println("请根据提示输入快递信息");System.out.println("请输入快递单号");String number = input.nextLine();System.out.println("请输入快递公司");String company = input.nextLine();Express e = new Express();e.setCompany(company);e.setNumber(number);return e;}/*** 提示快递员输入快递单号* @return 快递员输入的快递单号*/public String findByNumber(){System.out.println("请根据提示输入快递信息:");System.out.println("请输入要操作的快递单号: ");String number = input.nextLine();return number;}/*** 显示快递信息* @param e*/public void printExpress(Express e) {System.out.println("快递信息如下:");System.out.println("快递公司: " + e.getCompany() + ",快递单号: " + e.getNumber() + ",取件码:" + e.getCode());}/*** 修改快递信息* @param e*/public void update(Express e){//todo:做个校验:e是否为空System.out.println("请输入新的快递单号");String number = input.nextLine();System.out.println("请输入新的快递公司");String company = input.nextLine();e.setNumber(number);e.setCompany(company);}/*** 询问是否确认删除* @return 1表示确认, 2表示取消操作*/public int delete() {System.out.println("是否确认删除");System.out.println("1. 确认删除");System.out.println("2. 取消删除");System.out.println("0. 退出");String text = input.nextLine();int num = -1;try {num = Integer.parseInt(text);} catch (NumberFormatException e) {}if (num < 1 || num > 2) {System.out.println("输入错误,请重新输入");return delete();}return num;}/*** 给定数组的快递信息,遍历显示*/public void printAll(Express[][] es){int count = 0;//通过循环,打印输出快递信息for(int i=0;i<10;i++){for(int j=0;j<10;j++){if(es[i][j] != null){count++;System.out.print("第"+(i+1)+"排"+(j+1)+"列快递");printExpress(es[i][j]);}}}if (count == 0){System.out.println("暂无快递信息");}}/*** 当查询快递无信息时的提示语*/public void printNull(){System.out.println("快递不存在,请确认输入是否正确");}/*** 提示用户取件成功* @param e*/public void printCode(Express e){System.out.println("快递取件码为:"+e.getCode());}/*** 快递员存储时存储重复的提示语*/public void expressExist(){System.out.println("快递单号已存在");}/*** 操作成功提示语*/public void success(){System.out.println("操作成功");}/*** 取件人的菜单uMenu* @return*/public int uMenu(){System.out.println("请输入取件码");String code = input.nextLine();int num = -1;try{//将用户输入的取件码,转换为int数据类型num = Integer.parseInt(code);}catch(NumberFormatException e){System.out.println("请输入正确的取件码");return uMenu();}//判断取件码if(num<100000 || num>999999){System.out.println("输入错误,请重新输入");return uMenu();}return num;}}
