快递管理的基础实现
I.知识储备
1.面向对象:
面向对象是相对于面向过程来讲的,指的是把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事务的自然运行模式。
面向对象到面向过程,是程序员思想上从执行者到指挥者的转变。
2.MVC框架:
Model(模型):是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。
View(视图):是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。
Controller(控制器):是应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
MVC分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。例如,您可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易。
MVC分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。(来自百度百科)
II.任务概述
采用二维数组的方式,存储快递。
1.管理员:
快递录入:柜子位置(系统产生,不能重复,认为柜子10排10列)、快递单号(输入)、快递公司(输入)、6位取件码(系统产生,不能重复)
删除快递(根据单号)
修改快递(根据单号)
查看所有快递(遍历)
2.普通用户:
快递取出(根据取件码):显示快递的信息和在哪个柜子中,从柜子中移除这个快递
III.代码实现
一、com.java.view包
1.Views类
v视图展示(欢迎,菜单,子菜单…)
package com.java.view;
import com.java.bean.Express;
import java.util.Scanner;
public class Views {
private Scanner input = new Scanner(System.in);
/**
* 欢迎菜单
*/
public void hello() {
System.out.println("欢迎使用 XXX 快递管理系统!");
}
/**
* 再见菜单
*/
public void bye() {
System.out.println("感谢您的使用,再见!");
}
/**
* 主菜单
* @return 1-管理员 2-普通用户 0-退出
*/
public int menu() {
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 < 0 || num > 2) {
System.out.println("选择有误,请重新输入!");
return menu();
}
return num;
}
/**
* 管理员菜单
* @return 1-快递录入 2-删除快递 3-修改快递 4-查看所有快递 0-退出
*/
public int adminMenu() {
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 {
num = Integer.parseInt(text);
} catch(NumberFormatException e) {
}
if (num < 0 || num > 4) {
System.out.println("选择有误,请重新输入!");
return adminMenu();
}
return num;
}
/**
*快递录入
* @return 包含快递单号和快递公司的快递对象
*/
public Express add() {
System.out.println("请输入快递单号:");
String number = input.nextLine();
System.out.println("请输入快递公司:");
String company = input.nextLine();
Express e = new Express();
e.setNumber(number);
e.setCompany(company);
return e;
}
/**
* 根据单号查找快递
* @return 快递单号
*/
public String findByNumber() {
System.out.println("请输入要操作的快递单号:");
String number = input.nextLine();
return number;
}
/**
* 打印快递信息
* @param e 快递对象
*/
public void printExpress(Express e) {
System.out.println("快递单号:"+e.getNumber()+",快递公司:"+e.getCompany()+",取件码:"+e.getCode()+",所在柜子:第"+(e.getxAxis()+1)+"排第"+(e.getyAxis()+1)+"列");
}
/**
* 修改快递
* @return 包含快递单号和快递公司的快递对象
*/
public Express update() {
System.out.println("请输入修改后的快递单号:");
String number = input.nextLine();
System.out.println("请输入修改后的快递公司:");
String company = input.nextLine();
Express e = new Express();
e.setNumber(number);
e.setCompany(company);
return e;
}
/**
* 删除快递
* @return 1-确认删除 2-取消操作
*/
public int delete() {
System.out.println("是否确认删除此快递?");
System.out.println("1.确认删除");
System.out.println("2.取消操作");
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;
}
/**
* 打印所有快递
* @param es 所有快递对象
*/
public void printAll(Express[][] es) {
System.out.println("所有的快递信息如下:");
for(int i=0;i<10;i++) {
for(int j=0;j<10;j++) {
if(es[i][j] != null) {
printExpress(es[i][j]);
}
}
}
}
/**
* 普通用户菜单
* @return 取件码
*/
public int userMenu() {
System.out.println("正在进行快递取出操作!");
System.out.println("请输入六位取件码:");
String text = input.nextLine();
int num = -1;
try {
num = Integer.parseInt(text);
} catch(NumberFormatException e) {
}
if (num < 100000 || num > 999999) {
System.out.println("取件码有误,请重新输入!");
return userMenu();
}
return num;
}
/**
* 快递柜已满
*/
public void expressFull() {
System.out.println("快递柜已满,录入失败!");
}
/**
* 取件码不存在
*/
public void codeNotExist() {
System.out.println("取件码不存在,取件失败!");
}
/**
* 单号已存在
* @param select 1-录入失败 3-修改失败
*/
public void expressExist(int select) {
if(select == 1)
System.out.println("此单号已存在,录入失败!");
else if(select == 3)
System.out.println("此单号已存在,修改失败!");
}
/**
* 单号不存在
* @param select 2-删除失败 3-修改失败
*/
public void expressNotExist(int select) {
if(select == 2)
System.out.println("此单号不存在,删除失败!");
else if(select == 3)
System.out.println("此单号不存在,修改失败!");
}
/**
* 操作成功
* @param select 1-录入成功 2-删除成功 3-修改成功 4-取件成功
*/
public void success(int select) {
if(select == 1)
System.out.println("快递录入成功,快递信息如下:");
else if(select == 2)
System.out.println("删除快递成功,删除的快递信息如下:");
else if(select == 3)
System.out.println("修改快递成功,修改后的快递信息如下:");
else if(select == 4)
System.out.println("以下是您的快递信息,请前往对应柜子取走您的快递:");
}
}
二、com.java.bean包
2.Express类
作为快递对象,存取指定对象的各种属性,拥有get/set方法、构造方法、equals()、toString()等。
package com.java.bean;
import java.util.Objects;
public class Express {
private String number;
private String company;
private int code;
private int xAxis;
private int yAxis;
public Express() {
}
public Express(String number, String company, int code, int xAxis, int yAxis) {
this.number = number;
this.company = company;
this.code = code;
this.xAxis = xAxis;
this.yAxis = yAxis;
}
@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);
}
@Override
public String toString() {
return "Express{" +
"number='" + number + '\'' +
", company='" + company + '\'' +
", code=" + code +
", xAxis=" + xAxis +
", yAxis=" + yAxis +
'}';
}
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;
}
public int getxAxis() {
return xAxis;
}
public void setxAxis(int xAxis) {
this.xAxis = xAxis;
}
public int getyAxis() {
return yAxis;
}
public void setyAxis(int yAxis) {
this.yAxis = yAxis;
}
}
三、com.java.dao包
3.ExpressDao类
D数据存取(快递数据),本次为基础实现,使用二维数组存取。
package com.java.dao;
import com.java.bean.Express;
import java.util.Random;
public class ExpressDao {
private Express[][] data = new Express[10][10];
private Random random = new Random();
private int size = 0;
/**
* 用于存储快递对象
* @param e 要存储的快递对象
* @return true-存储成功 false-存储失败
*/
public boolean add(Express e) {
if(size >= 100) {
return false;
}
//1.随机生成2个0-9个下标
int x = -1;
int y = -1;
while(true) {
x = random.nextInt(10);
y = random.nextInt(10);
if(data[x][y] == null) {
//此位置无快递
break;
}
}
//2.取件码
int code = randomCode();
e.setCode(code);
e.setxAxis(x);
e.setyAxis(y);
data[x][y] = e;
size++;
return true;
}
/**
* 随机生成取件码
* @return 随机生成的取件码
*/
private int randomCode() {
while(true) {
int code = random.nextInt(900000)+100000;
Express e = findByCode(code);
if(e == null) {
return code;
}
}
}
/**
* 根据快递单号查询快递对象
* @param number 要查询的快递单号
* @return 查询的结果,查询失败时返回null
*/
public Express findByNumber(String number) {
Express e = new Express();
e.setNumber(number);
for(int i=0;i<10;i++) {
for(int j=0;j<10;j++) {
if(e.equals(data[i][j])) {
return data[i][j];
}
}
}
return null;
}
/**
* 根据取件码查询快递对象
* @param code 要查询的取件码
* @return 查询的结果,查询失败时返回null
*/
public Express findByCode(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;
}
/**
* 用于修改快递对象
* @param oldExpress 旧的快递对象
* @param newExpress 新的快递对象
* @return true-修改成功 false-修改失败
*/
public boolean update(Express oldExpress,Express newExpress) {
Express e = findByNumber(newExpress.getNumber());
if(e == null || e.equals(oldExpress)) {
oldExpress.setNumber(newExpress.getNumber());
oldExpress.setCompany(newExpress.getCompany());
return true;
} else {
return false;
}
}
/**
* 用于删除快递对象
* @param e 要删除的快递对象
*/
public void delete(Express e) {
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;
size--;
break p;
}
}
}
}
/**
* 遍历所有快递对象
* @return 所有快递对象
*/
public Express[][] findAll() {
return data;
}
}
四、com.java.main包
4.Main类
main方法,没什么可说的,更多的调度逻辑在Client类中。
package com.java.main;
import com.java.view.Views;
public class Main {
public static void main(String[] args) {
Views v = new Views();
v.hello();
m:while(true) {
int menu = v.menu();
switch(menu) {
case 1: Cilent.adminClient(); break;
case 2: Cilent.userClient(); break;
case 0: break m;
}
}
v.bye();
}
}
5.Client类
C调度逻辑(根据视图接收到的用户输入内容,调度数据存取)
package com.java.main;
import com.java.bean.Express;
import com.java.dao.ExpressDao;
import com.java.view.Views;
public class Cilent {
private static Views v = new Views();
private static ExpressDao dao = new ExpressDao();
/**
* 普通用户
*/
public static void userClient() {
int code = v.userMenu();
Express e = dao.findByCode(code);
if(e == null) {
v.codeNotExist();
} else {
v.success(4);
v.printExpress(e);
dao.delete(e);
}
}
/**
* 管理员
*/
public static void adminClient() {
while(true) {
int menu = v.adminMenu();
switch (menu) {
case 1: add(); break;
case 2: delect(); break;
case 3: update(); break;
case 4: printAll(); break;
case 0: return;
}
}
}
/**
* 快递录入
*/
private static void add() {
Express e = v.add();
Express e2 = dao.findByNumber(e.getNumber());
if (e2 == null) {
boolean result = dao.add(e);
if (result) {
v.success(1);
v.printExpress(e);
} else {
v.expressFull();
}
} else {
v.expressExist(1);
}
}
/**
* 删除快递
*/
private static void delect() {
String number = v.findByNumber();
Express e = dao.findByNumber(number);
if (e == null) {
v.expressNotExist(2);
} else {
v.printExpress(e);
int delete = v.delete();
if (delete == 1) {
dao.delete(e);
v.success(2);
v.printExpress(e);
}
}
}
/**
* 修改快递
*/
private static void update() {
String number = v.findByNumber();
Express e = dao.findByNumber(number);
if (e == null) {
v.expressNotExist(3);
} else {
v.printExpress(e);
Express e2 = v.update();
boolean result = dao.update(e, e2);
if (result) {
v.success(3);
v.printExpress(e);
} else {
v.expressExist(3);
}
}
}
/**
* 查看所有快递
*/
private static void printAll() {
Express[][] data = dao.findAll();
v.printAll(data);
}
}