修改后的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;
}
@Override
public String toString() {
return "Express{" +
"number='" + number + '\'' +
", company='" + company + '\'' +
", code=" + code +
'}';
}
@Override
public 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);
}
@Override
public 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+100000
while(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){
//命名循环为p
p: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:改为findAllExpress
v.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;
}
}