????????
????????用小区快递系统作为一个案例来实操是非常贴近生活的,在很多小区已经普及了智能的快递柜。作为一个Java入门的小白该如何写好小区快递系统呢?用老师专业的话来说这是一个从0-1,再从1-2的过程。在之前的章节作业中就要求我们来编写一个小区快递系统(还没有涉及到面向对象),所以可想而知,代码就全部堆在一个类中,耦合度非常高,显得很杂乱。但是这就是从0-1的开始,没有比较就没有收获。先上我之前写的代码:
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
public class Ezhan {
public static void main(String[] args) {
//创建快递信息存储数组
//快递单号
int[] deliver = new int[3];
//取件码
int[] code1 = new int[3];
//快递公司名称
String[] name = new String[3];
int index = -1;
System.out.println("=====欢迎使用新职课快递柜=====");
int over = 0;
while (true) {
System.out.println("请输入您的身份:1-快递员 2-用户");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
if (n == 1) { // 1 表示是快递员在操作 2表示用户在操作
System.out.println("请选择操作:1-存快递 2=删除快递 3-修改快递信息 4-查看所有快递");
Scanner a = new Scanner(System.in);
int num = a.nextInt();
switch (num) {
case 1: //1-存快递
System.out.println("请输入快递单号:");
Scanner b = new Scanner(System.in);
int number = b.nextInt();
for (int i = 0; i < deliver.length; i++) {
if (deliver[i] == 0) {
index = i;
break;
}
}
deliver[index] = number;//通过遍历将快递单号存入数组
System.out.println("请输入公司名称");
Scanner c = new Scanner(System.in);
String company = c.next();
name[index] = company;//将公司名称存入数组
//随机生成取件码
int code = (int) ((Math.random() * 9 + 1) * 100);
code1[index] = code;//将取件码存入数组
System.out.println("快递已存入,取件码是:" + code);
break;
case 2://2-删除快递
int k = 0;//定义一个变量来判断是否找到了待删除的快递单号
System.out.println("请你输入要删除的快递单号:");
Scanner del = new Scanner(System.in);
int delnum = del.nextInt();//用户输入想要删除的快递单号
for (int i = 0; i < deliver.length; i++) {
if (deliver[i] == delnum) //通过遍历判断数组中是否有待删除的快递单号
{
k = 1;//存在则将变量的值变为1
for (int j = i; j < deliver.length - 1; j++) {
int temp = deliver[j];
deliver[j] = deliver[j + 1];
deliver[j + 1] = temp;
}//将待删除的快递单号的后面的每一个值覆盖前面的值
deliver[deliver.length - 1] = 0;//将快递单号的数组中最后一个值变为零
System.out.println("删除成功");
}
}
if (k == 0) //如何变量k的值仍是0,则说明数组中没有要删除的对象
{
System.out.println("不存在该单号!");
}
break;
case 3:// 修改快递的数据
int f = 0;//定义变量c判断是否有待修改的快递单号
System.out.println("请输入要修改的快递单号:");
Scanner retry = new Scanner(System.in);
int renumber = retry.nextInt();
System.out.println("请输入新的快递单号:");
Scanner new1 = new Scanner(System.in);
int newnumber = new1.nextInt();
System.out.println("请输入新的公司名称:");
Scanner new2 = new Scanner(System.in);
String newcompany = new2.next();
for (int i = 0; i < deliver.length; i++) {
if (deliver[i] == renumber) {
f = 1;
deliver[i] = newnumber;
name[i] = newcompany;
}
}
if (f == 1) {
System.out.println("修改成功!");
} else {
System.out.println("没有该单号!");
}
break;
case 4://查看所有快递的信息
System.out.println("所有快递信息如下:");
System.out.println("快递单号" + " " + "公司名称" + " " + "取件码");
for (int i = 0; i < deliver.length; i++) {
if (deliver[i] != 0) {
System.out.print(deliver[i]);
System.out.print(" ");
System.out.print(name[i]);
System.out.print(" ");
System.out.print(code1[i]);
System.out.println();
}
}
}
} else //在第一个选择,如果输入的不是1,则表示是用户在操作
{
int s = 0;
System.out.println("请输入取件码:");
Scanner re = new Scanner(System.in);
int receivenum = re.nextInt();
for (int i = 0; i < deliver.length; i++) {
if (code1[i] == receivenum) {
s = 1;
System.out.println("取件成功!");
}
}
if (s == 0) {
System.out.println("无该取件码!");
}
}
System.out.println("是否还要进行操作 0-继续 1-结束");
Scanner a1 = new Scanner(System.in);
int u = a1.nextInt();
if (u == 0) {
continue;
} else {
break;
}
}
}
}
?运行效果:
?下面看看从1-2的过程(单车变摩托!哈哈~)
1.视图-Views类
import java.util.Scanner;
//快递管理系统视图
public class Views {
private Scanner input = new Scanner(System.in);
/*
欢迎界面
*/
public void welcome() {
System.out.println("欢迎使用快递管理系统!");
}
/*
再见界面
*/
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.退出");
String choose = input.nextLine();
int num = -1;
//对于传入的num进行异常处理
try {
num = Integer.parseInt(choose);//将接受的字符型转为整形
} 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 choose = input.nextLine();
int num = -1;
try {
num = Integer.parseInt(choose);//将接受的字符型转为整形
} 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.setNumber(number);
e.setCompany(company);
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) {
System.out.println("请输入新的快递单号:");
String number = input.nextLine();
System.out.println("请输入新的快递公司:");
String company = input.nextLine();
e.setCompany(company);
e.setNumber(number);
}
/**
* 询问是否确认删除
*
* @return 1.表示确认 2.表示取消操作
*/
public int delete() {
System.out.println("是否确认删除?");
System.out.println("1.确认删除");
System.out.println("2.取消操作");
String choose = input.nextLine();
int num = -1;
try {
num = Integer.parseInt(choose);//将接受的字符型转为整形
} catch (NumberFormatException e) {
}
if (num < 1 || num > 2) {
System.out.println("输入有误,请重新输入");
return delete();
}
return num;
}
/**
* 将给定数组的快递信息 遍历显示
* @param es
*/
public void printAll(Express[][] es) {
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
if(es[i][j]!=null){
System.out.println("第"+(i+1)+"排"+(j+1)+"列快递:");
printExpress(es[i][j]);
}
}
}
}
/**
* 用户的菜单
*
* @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) {
System.out.println("输入有误,请重新输入");
return uMenu();
}
return num;
}
public void expressExist(){
System.out.println("此单号在快递柜中已存在,请勿重复存储。");
}
public void printnull(){
System.out.println("快递不存在,请检查您的输入。");
}
public void printCode(Express e){
System.out.println("快递的取件码为:"+e.getCode());
}
public void success(){
System.out.println("操作成功!");
}
public void printhavenull(int i){
if(i==0){
System.out.println("快递柜为空.");
}
}
}
2.数据存储-Express类
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 number != null ? number.equals(express.number) : express.number == null;
}
@Override
public int hashCode() {
return code;
}
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;
}
}
?3.调度逻辑-ExpressDao类
import ExpressMangement.Express;
import javax.print.DocFlavor;
import java.util.Random;
public class ExpressDao {
private Express[][] data = new Express[10][];
//当前存储的快递数量
private int size;
{
for (int i = 0; i < 10; i++) {
data[i] = new Express[10];
}
}
private Random random = new Random();
/**
* 用于存储快递
*
* @param e
* @return
*/
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);
data[x][y] = e;
return true;
}
/**
* 模板方法设计模式
*
* @return
*/
private int randomCode() {
while (true) {
int code = random.nextInt(900000) + 100000;
Express e = findByCode(code);
if (e == null) {
return code;
}
}
}
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;
}
/**
* 多余的操作,为了mvc更圆润
*
* @param old
* @param new1
*/
public void update(Express old, Express new1) {
delete(old);
add(new1);
}
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;
break p;
}
}
}
}
/**
* 将给定的数组的快递信息 遍历显示
*/
public Express[][] findAll() {
return data;
}
public int haveNull(Express[][] e) {
int x = 0;
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (data[i][j] != null) {
x++;
}
}
}
return x;
}
}
4.Main方法测试-Main类
public class Main {
//初始化试图对象
static Views view = new Views();
//初始化dao对象
static ExpressDao dao = new ExpressDao();
//1.欢迎
public static void main(String[] args) {
view.welcome();
//2. 弹出身份选择菜单
while (true) {
int menu = view.menu();
switch (menu) {
case 0:
return;
case 1:
cClient();
break;
case 2:
uClient();
break;
}
}
}
public static void cClient() {
while (true) {
int menu = view.cMenu();
switch (menu) {
case 0:
return;
case 1: {
//1.提示输入快递信息
Express e = view.insert();
//2.判断快递是否已经存储
Express e2 = dao.findByNumber(e.getNumber());
//3.存快递
if (e2 == null) {
dao.add(e);
} else {
view.expressExist();
}
break;
}
case 2: {//修改快递
//1.提示输入信息
String number = view.findByNumber();
dao.findByNumber(number);
Express e = dao.findByNumber(number);
Express e2 = e;
if (e == null) {
view.printnull();
} else {
view.printExpress(e);
//4.提示修改
view.update(e2);
dao.update(e, e2);
view.printCode(e2);
}
}
break;
case 3:
//删除
String number = view.findByNumber();
Express 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: {
//查看所有
Express[][] data = dao.findAll();
int i = dao.haveNull(data);
view.printhavenull(i);
view.printAll(data);
}
break;
}
}
}
public static void uClient() {
//1.获取取件码
int code = view.uMenu();
//2.根据取件码取出快递
Express e = dao.findByCode(code);
if (e == null) {
view.printnull();
} else {
view.success();
view.printExpress(e);
}
????}
}
看看运行的效果:
将第一次写的代码和第二次写的进行比较,会发现运用面向对象写的代码多了好几倍,运行效果差别不是很大。但是仔细阅读代码,便会发现第二次代码的思路非常清楚,每一个类都有单独且完整的功能,在最后的测试类中,只要根据需求有序的调用他们就可以实现。虽然在这类小项目中,代码量会显得多的多,但是一旦到了特别大的项目,使用MVC低耦合、高复用的优势便会显现。
模块分析:
1.V视图展示(欢迎,菜单,子菜单......)
2.D数据存取(快递数据)
3.C调度逻辑(根据视图接受收到的用户输入的内容,调度数据)
|