目录
前面两节我们实现了视图层(Java实现快递管理系统(View视图层))和数据层(Java实现快递管理系统(Dao数据层)),这一节我们实现逻辑层Main。
一、要实现的快递管理系统的功能
二、模块分析
三、代码功能实现分析&&总览
Main | 逻辑层类 |
private static Views v = new Views(); private static ExpressDao dao = new ExpressDao(); | 持有视图层和数据层的操作对象 |
public static void main(String[] args ) | 程序入口:
|
private static void cClient() | 处理与快递员交互的逻辑:
|
private static void uClient() | 处理与普通用户交互的逻辑:
|
四、代码展示
1. 逻辑层Main类代码展示
package day08.develop.main;
import day08.develop.bean.Express;
import day08.develop.dao.ExpressDao;
import day08.develop.view.Views;
/**
* 逻辑层Main
* 这里其实可以将uClient和cClient封装成两个类,这样比较合理
*/
public class Main {
private static Views v = new Views();
private static ExpressDao dao = new ExpressDao();
public static void main(String[] args ){
//1.欢迎
v.welcome();
//2.弹出菜单
m:while(true) {
int menu = v.menu();
switch (menu) {
case 0:
break m;
case 1:
cClient();
break;
case 2:
uClient();
break;
}
}
//3.再见
v.bye();
}
/**
* 快递员的菜单
*/
private static void cClient() {
while(true) {
int menu = v.cMenu();
switch (menu) {
case 0:
return;
case 1: {//快递录入(加大括号避免变量名重复)
//1.提示输入快递信息
Express e = v.insert();//接收到用户输入的快递对象
//2. 判断此快递是否已经存储过
Express e2 = dao.findByNumber(e.getNumber());
//3. 存储快递
if(e2 == null) {
dao.add(e);//存储快递
v.printExpress(e); //显示快递信息
}else{//单号在快递柜中已存在
//这里发现是视图层缺少一个提示方法,加进去
v.expressExist();
}
break;
}
case 2: {//快递删除
//1.输入快递单号
String number = v.findByNumber();
//2.查找快递对象
Express e = dao.findByNumber(number);
//3.删除快递
if(e == null){//快递单号不存在
v.printNull();
}else{
v.printExpress(e);//打印快递对象
int option = v.delete();//询问用户是否确认删除
if(option == 1){
dao.delete(e);//删除数据
//这里视图层缺少一个提示成功的方法
v.success();//提示操作成功
}
}
break;
}
case 3: {//快递修改
//1.获取用户输入的单号
String number = v.findByNumber();
//2. 查找数据
Express e = dao.findByNumber(number);
Express e2 = e;
//3.打印快递数据
if(e == null){//没有查找到快递信息
v.printNull();
}else {//查找到了快递信息
v.printExpress(e);//(这里视图层缺少一个打印空的快递的方法)
v.update(e2);提示新的输入,这里面对引用进行了修改
dao.update(e,e2);//圆润逻辑
//5.显示快递信息
v.printExpress(e);
}
break;
}
case 4: {//查看所有数据
//1.查找到所有数据
Express [][]es = dao.findAll();
//2.显示所有快递
v.printAll(es);
break;
}
}
}
}
/**
* 用户的菜单
*/
private static void uClient() {
//1.获得取件码
int code = v.uMenu();
//2.根据取件码取出快递
Express e = dao.findByCode(code);
if(e == null){//没有找到该取件码
v.printNull();
}else{
v.printExpress(e);//打印快递信息
dao.delete(e);//从快递柜中删除快递
v.success();//提示操作成功
}
}
}
2. 修改后的视图层Views类代码展示
package day08.develop.view;
import day08.develop.bean.Express;
import java.util.Scanner;
/**
* View 视图展示
* 打印信息和接收用户输入
*/
public class Views {
Scanner input = new Scanner(System.in);
/**
打印欢迎信息
*/
public void welcome(){
System.out.println("欢迎使用哈哈哈的快递管理系统");
}
/**
打印退出信息
*/
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.退出");
//全局都使用nextLine获取用户输入, 不会产生冲突,可以输入一些特殊的字符如空格等
String text = input.nextLine();
int option = -1;
try {
option = Integer.parseInt(text);
}catch (NumberFormatException e){//捕获非数字的输入
//do nothing
}
if(option<0 || option>2){//选择不在规定范围内,再次选择
System.out.println("输入有误,请重新输入");
return menu();
}
return option;
}
/**
快递员的菜单
@return 1快递录入 2快递删除 3快递修改 4查看所有快递 0退出
*/
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.退出");
//全局都使用nextLine获取用户输入, 不会产生冲突,可以输入一些特殊的字符如空格等
String text = input.nextLine();
int option = -1;
try {
option = Integer.parseInt(text);
}catch (NumberFormatException e){//捕获非数字的输入
//do nothing
}
if(option<0 || option>4){//选择不在规定范围内,再次选择
System.out.println("输入有误,请重新输入");
return cMenu();
}
return option;
}
/**
快递员录入快递
@return 录入的快递(非完整)
*/
public Express insert(){
System.out.println("请根据提示,输入快递信息");
System.out.println("请输入快递的单号:");
String number = input.nextLine();
System.out.println("请输入快递的公司:");
String company = input.nextLine();
//要返回两个数据——封装(取件码是柜子生成的,不属于Views
Express express = new Express();
express.setNumber(number);
express.setCompany(company);
return express;
}
/**
快递修改流程:Views findByName输入快递单号->调度逻辑Dao查找快递->Views printExpress打印快递信息
->View update输入修改后的快递信息->Dao存入快递柜
*/
/**
输入快递单号
@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());
}
/**
* 打印空的快递信息
*/
public void printNull(){
System.out.println("快递不存在,请检查您的输入");
}
/**
@param e 要修改的快递
修改快递信息,传来的是引用无需返回
*/
public void update(Express e){
System.out.println("请根据提示,输入新的快递信息:");
System.out.println("请输入新的快递单号:");
String number = input.nextLine();
System.out.println("请输入新的快递公司");
String company = input.nextLine();
//修改对象信息
e.setNumber(number);
e.setCompany(company);
}
/**
快递删除流程:Views findByName输入快递单号->调度逻辑Dao查找快递->Views printExpress打印快递信息
->View delete询问是否确认删除->Dao从快递柜删除快递
*/
/**
* 询问是否确认删除
* @return 1确认 2取消操作 0退出
*/
public int delete(){
System.out.println("是否确认删除?");
System.out.println("1.确认");
System.out.println("2.取消操作");
System.out.println("0.退出");
//全局都使用nextLine获取用户输入, 不会产生冲突,可以输入一些特殊的字符如空格等
String text = input.nextLine();
int option = -1;
try {
option = Integer.parseInt(text);
}catch (NumberFormatException e){//捕获非数字的输入
//do nothing
}
if(option<0 || option>4){//选择不在规定范围内,再次选择
System.out.println("输入有误,请重新输入");
return cMenu();
}
return option;
}
/**
* 将给定数组中的快递信息遍历显示
* @param es 所有快递
*/
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) {
System.out.print("第"+(i+1)+"排 "+(j+1)+"列快递:");
printExpress(es[i][j]);
count++;
}
}
}
if(count == 0){
System.out.println("暂无快递信息");
}
}
/**
用户的菜单
@return 用户输入的取件码
*/
public int uMenu(){
System.out.println("根据提示,进行取件:");
System.out.println("请输入您的取件码");
//全局都使用nextLine获取用户输入, 不会产生冲突,可以输入一些特殊的字符如空格等
String code = input.nextLine();
int num = -1;
try {
num = Integer.parseInt(code);
}catch (NumberFormatException e){//捕获非数字的输入
//do nothing
}
if(num<100000 || num>999999){//选择不在规定范围内,再次选择
System.out.println("输入有误,请重新输入");
return uMenu();
}
return num;
}
/**
* 用户取件流程:Views输入取件码->Dao根据取件码查找快递->Views printExpress打印快递信息 ->Dao从快递柜取出快递
*/
/**
* 快递单号已存在
*/
public void expressExist(){
System.out.println("此单号在快递柜中已存在,请勿重复存储");
}
// /**
// * 显示取件码
// * @param e 要显示取件码的快递
// */
// public void printCode(Express e){
// System.out.println("快递的取件码为"+e.getCode());
// }
/**
* 提示操作成功
*/
public void success(){
System.out.println("操作成功");
}
}
对Express类小bug的修改:
package day08.develop.bean;
import java.util.Objects;
/**
* 快递
*/
public class Express {
private String number;//单号
private String company;//公司
private int code;//取件码
public Express(){
}
/*
只要快递单号相同就是同一个快递
*/
@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 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;
}
}