3.二维数组+MVC完成快递增删改查
- 快递管理系统
- 问题描述:
- 模块分析:
- 1.V视图展示(给用户提示:欢迎,菜单,子菜单以及用户输入)
- 2.D数据存取(快递数据)
- 3.C调度逻辑(根据视图接收到用户输入内容,调度数据存取)
- 其实视图和数据存取这块写的代码都是工具,在调度逻辑中通过视图对象v 调用方法给用户提示并接收用户输入,通过dao对象调用其方法进行数据 的增删改查,在调度逻辑中主要就是不断的调用方法实现逻辑。
- bean包实体类Express
package com.cbw.bean;
import java.util.Objects;
//bean实体类,bean对象没有任何业务逻辑,所有属性全部私有,提供getter,setter
public class Exprerss {
private String number;//快递单号
private String company;//快递公司
private int code; //取件码
public Exprerss() { }
public Exprerss(String number, String company, int code) {
this.number = number;
this.company = company;
this.code = code;
}
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; }
@Override
public String toString() {
return "Exprerss{" +
"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;
Exprerss exprerss = (Exprerss) o;
return Objects.equals(number, exprerss.number);
}
@Override
public int hashCode() { return Objects.hash(number); }
}
- view包视图类Views
package com.cbw.view;
import com.cbw.bean.Exprerss;
import java.util.Scanner;
//V视图展示(给用户提示:欢迎,菜单,子菜单)
//负责给用户展示并接收数据返回结果给调用者,调用者进行调度逻辑
//把所有需要给用户展示的视图作为独立的逻辑封装在类中作为对象的方法存在
public class Views {
//不止menu中需要输入数据,封装属性,供本类所有方法使用
private Scanner input=new Scanner(System.in);
/**
* 欢迎
*/
public void welcome(){
System.out.println("欢迎使用xxx快递管理系统");
}
/**
* 再见
*/
public void bye(){
System.out.println("欢迎下次使用");
}
/**
* 选择身份的菜单
* @return
*/
public int menu(){
System.out.println("根据提示,输入功能序号:");
System.out.println("1.快递员");
System.out.println("2.用户");
System.out.println("0.退出");
//这里的代码逻辑,相较于input.nextInt()优点在哪?
//1.使用nextInt接收数据,有什么不好?
//2.单是下面代码逻辑是没有优点的,但是就全局代码,是有优点的:
// 1.nextLine和其他的next方法有冲突,
// 2.所有输入都使用nextLine,这样不会因为输入产生冲突,还可以接收各种类型数据
String text = input.nextLine();
int num=-1;
//public static int parseInt(String s) throws NumberFormatException
//parseInt方法抛出数字格式化异常,调用者处理异常(RuntimeException)
try{
num = Integer.parseInt(text);
}catch (NumberFormatException e){
}
if (num<0||num>2){
System.out.println("请输入正确序号");
return menu();
}
return num;
}
/**
* 快递员子菜单
* @return
*/
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{
num = Integer.parseInt(text);
}catch (NumberFormatException e){
}
if (num<0||num>4){
System.out.println("请输入正确序号");
return menu();
}
return num;
}
/**
* 快递员录入快递
* @return 包含了快递单号和快递公司的快递单号
*/
public Exprerss insert(){
System.out.println("根据提示输入快递信息:");
System.out.println("输入快递单号:");
String number = input.nextLine();
System.out.println("输入快递公司:");
String company = input.nextLine();
//生成取件码属于存快递逻辑,不属于视图,视图只负责打印和接收数据并返回数据
Exprerss e = new Exprerss();
e.setNumber(number);
e.setCompany(company);
return e;
}
/**提示用户输入快递单号
* 修改和删除快递都需要,抽取成方法
* @return
*/
public String findByNumber(){
System.out.println("根据提示输入快递信息:");
System.out.println("输入查询的快递单号:");
String num = input.nextLine();
return num;
}
/**
* 显示快递信息
* @param e
*/
public void printExpress(Exprerss e){
System.out.println("快递信息如下:");
System.out.println("快递公司:"+e.getCompany()+",快递单号"+e.getNumber()
+",取件码"+e.getCode());
}
public void printNull(){
System.out.println("快递不存在,请检查输入");
}
/**
* 修改快递信息
* @param e
* @return
*/
public void update(Exprerss e){
System.out.println("请根据提示,输入快递信息:");
System.out.println("输入要修改的快递单号:");
String num = input.nextLine();
System.out.println("输入要修改的快递公司:");
String company = input.nextLine();
e.setNumber(num);
e.setCompany(company);
}
/**
* 确认是否删除
* @return
*/
public int delete(){
System.out.println("是否确认删除?");
System.out.println("1.确认删除 2.取消删除 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 delete();
}
return num;
}
/**
* 打印所有快递
* @param es
*/
public void printAll(Exprerss[][] 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("暂无快递信息");
}
}
/**
* 用户子菜单
* @return
*/
public int uMenu() {
System.out.println("根据提示,进行取件:");
System.out.println("请输入取件码:");
String code = input.nextLine();
int num=-1;
try{
num = Integer.parseInt(code);
}catch (NumberFormatException e){
}
if (num<100000||num>999999){ //6位取件码
System.out.println("输入有误,重新输入");
return uMenu();
}
return num;
}
/**
* 快递单号存在时给出提示
*/
public void expressExist(){
System.out.println("此单号在快递柜中已存在,勿重复存储");
}
public void success(){
System.out.println("操作成功");
}
}
- dao包操作数据的类ExpressDao
package com.cbw.dao;
import com.cbw.bean.Exprerss;
import java.util.Objects;
import java.util.Random;
//数据操作的类,定义数据的增删改查操作
public class ExpressDao {
private Exprerss[][] data=new Exprerss[10][];//充当数据库
{
for (int i=0;i<10;i++){
data[i]=new Exprerss[10]; //data[i]表示第i行首地址
}
}
private int size;//记录数组存储元素个数
private Random random=new Random();
/**
* 存快递:
* 确定柜子有位置--x,y下标找到空柜--快递入柜
* @param e
* @return
*/
public boolean add(Exprerss e){
//不考虑快递单号重复,且随机存储
//随机生成2个0-9下标,循环直到找到空柜为止,若柜满则无限循环,
//为此可以定义变量size记录快递数量代替遍历数组,空间换时间。
if (size==100){
return false;
}
int x=-1;
int y=-1;
while(true){
x = random.nextInt(10);
y=random.nextInt(10);
if (data[x][y]==null){ //找到空柜
break;
}
}
//补全快递信息存入柜中
int code=randomCode();
//System.out.println("code1:"+code);
e.setCode(code);
data[x][y]=e;
return true;
}
/**
* 生成取件码(不重复:若根据取件码查询到快递则重复)
* @return
*/
public int randomCode(){
while(true){
int code=random.nextInt(900000)+ 100000;
System.out.println("code:"+code);
Exprerss e=findByCode(code);
if (e==null){
return code;
}
}
}
/**
* 根据快递单号查询快递
* @param number
* @return
*/
public Exprerss findByNumber(String number){
//下面比较单号是用对象比较,实体类重写equals方法比较规则是单号,
//data[i][j].getNumber()比较单号,用的equals是String重写的,不是自己重写的
Exprerss e = new Exprerss();
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
*/
public Exprerss findByCode(int code){
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (data[i][j]!=null&&data[i][j].getCode()==code){
return data[i][j];
}
}
}
return null;
}
/**多余操作,为了mvc更圆润。
* 模拟数据库,删除原数据,保存新数据
* @param oldExpress
* @param newExpress
*/
public void update(Exprerss oldExpress,Exprerss newExpress ){
delete(oldExpress);
add(newExpress);
}
/**
* 根据快递单号删除快递
* @param e
*/
public void delete(Exprerss 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;
break p;
}
}
}
}
/**
* 查询所有快递
* @return
*/
public Exprerss[][] findAll(){
return data;
}
}
- main包调度逻辑的类Main
package com.cbw.main;
import com.cbw.bean.Exprerss;
import com.cbw.dao.ExpressDao;
import com.cbw.view.Views;
import javax.swing.text.View;
//调度逻辑
public class Main {
//初始化视图对象和dao对象(数据操作)
private static Views view = new Views();
private static ExpressDao dao = new ExpressDao();
public static void main(String[] args) {
//1.欢迎
view.welcome();
//2.循环 弹出身份选择菜单
f:while(true){
int menu = view.menu();
switch (menu){
case 0:
break f;
case 1:
cClient();//快递员菜单
break ;
case 2:
uClient();//用户菜单
break ;
}
}
view.bye();//程序结束
}
/**
* 快递员菜单
*/
private static void cClient() {
//int cmenu = view.cMenu();
int cmenu;
while(true){
cmenu=view.cMenu();
switch (cmenu){
case 0:
return;
case 1: {//存快递
//输入快递信息
Exprerss e = view.insert();
//此快递是否存储过
Exprerss e1 = dao.findByNumber(e.getNumber());
if (e1 == null) { //未存储过
dao.add(e);
view.printExpress(e);//打印快递信息
} else {
//快递单号在柜中已存在
view.expressExist();
}
}
break;
case 2:{//修改快递
//view提示用户输入快递单号
String number = view.findByNumber();
//dao根据快递单号查找快递
Exprerss e = dao.findByNumber(number);
//打印快递信息
if(e==null){
view.printNull();
}else {
view.printExpress(e);
}
//修改快递信息
view.update(e);
dao.update(e,e);
view.printExpress(e);//打印快递信息
}
break;
case 3: {
//删除
//输入快递单号
String number = view.findByNumber();
//查找快递对象
Exprerss e = dao.findByNumber(number);
//
if (e == null) {
view.printNull();//没找到快递,输入单号有问题
} else {
view.printExpress(e);//找到并打印
int type = view.delete();//确认删除与否
if (type == 1) { //确认要删除
dao.delete(e);
view.success();
}
}
}
break;
case 4:
//查看所有
Exprerss[][] all = dao.findAll();
view.printAll(all);
break;
}
}
}
private static void uClient() {
//获取取件码
int code = view.uMenu();
//取出快递
Exprerss e = dao.findByCode(code);
if (e==null){
view.printNull();
}else{
view.success();
view.printExpress(e);
dao.delete(e);
}
}
}
快递录入
修改快递
查询快递
取件