成为Java程序员Day10:快递管理系统
程序员文章站
2024-03-24 09:42:04
...
题目
题目分析
快递管理系统
MVC框架
模块分析:
1.V视图展示(欢迎,菜单,子菜单…)
2.M 数据存储(快递数据)
3.C调度逻辑(根据视图接受到用户输入,调度数据。
/*
*先分成三部分去理解,先创建三个包,分别为视图vivew,数据存储bean和调度逻辑dao
*/
view
package com.kaikeba.Day9.dao;
import com.kaikeba.Day9.bean.Express;
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();
public boolean add(Express e) {
if (size == 100) {
return false;
}
// 随机生成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;
}
}
// 取件码
int code = randomCode();
e.setCode(code);
data[x][y] = e;
return true;
}
/*
*
* 模板方法设计模式
*
* */
private int randomCode() {
//100000-999999
//0-899999
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(data[i][j].equals(e)){
// return data[i][j];
//
// }
//data[i][j]有可能是空的 所以不能把它放前面
if(e.equals(data[i][j])){
return data[i][j];
}
}
}
return null;
}
/*
*
* 根据取件码查询快递
* code 要查询的取件码
* 查询的结果,查询失败返回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更圆润。
* */
public void update(Express oldExpress , Express newExpress) {
delete(oldExpress);
add(newExpress);
}
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;
}
}
bean.Express
package com.kaikeba.Day9.bean;
import java.util.Objects;
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 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 +
'}';
}
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.ExpressDao
package com.kaikeba.Day9.dao;
import com.kaikeba.Day9.bean.Express;
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();
public boolean add(Express e) {
if (size == 100) {
return false;
}
// 随机生成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;
}
}
// 取件码
int code = randomCode();
e.setCode(code);
data[x][y] = e;
return true;
}
/*
*
* 模板方法设计模式
*
* */
private int randomCode() {
//100000-999999
//0-899999
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(data[i][j].equals(e)){
// return data[i][j];
//
// }
//data[i][j]有可能是空的 所以不能把它放前面
if(e.equals(data[i][j])){
return data[i][j];
}
}
}
return null;
}
/*
*
* 根据取件码查询快递
* code 要查询的取件码
* 查询的结果,查询失败返回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更圆润。
* */
public void update(Express oldExpress , Express newExpress) {
delete(oldExpress);
add(newExpress);
}
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;
}
}
main
package com.kaikeba.Day9.main;
import com.kaikeba.Day9.bean.Express;
import com.kaikeba.Day9.dao.ExpressDao;
import com.kaikeba.Day9.view.Views;
public class main {
// 初始化视图对象
private static Views v = new Views();
private static ExpressDao dao = new ExpressDao();
public static void main(String[] args) {
// 初始化dao对象
ExpressDao dao = new ExpressDao();
// 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;
}
}
v.bye();
}
private static void uClient() {
// 1.取件码获取
int code = v.uMenu();
// 2.根据取件码,取出快递。
Express e = dao.findByCode(code);
if (e == null){
v.printNull();
}else {
v.success();
v.prinExpress(e);
}
}
private static void cClient() {
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.prinExpress(e);
} else {
// 快递单号已经存在
v.expressExist();
}
}
break;
case 2: {
// 快递修改
// 1.提示输入快递信息
String number = v.findByNumber();
// 2.查找数据
Express e = dao.findByNumber(number);
Express e2 = e;
if (e == null) {
v.printNull();
} else {
v.prinExpress(e);
// 4.提示修改
v.update(e2);
dao.update(e, e2);
}
}
break;
case 3: {
// 删除
// 1.提示输入快递信息
String number = v.findByNumber();
// 2.查找数据
Express e = dao.findByNumber(number);
if (e == null) {
v.printNull();
} else {
v.prinExpress(e);
int type = v.delete();
if (type == 1 ){
dao.delete(e);
v.success();
}
}
}
break;
case 4: {
// 查看所有
Express[][] data=dao.findAll();
v.printAll(data);
}
break;
}
}
}
总结:
MVC框架
1.分开处理,将视图,数据,和调度逻辑分开,分别处理。
2.可以忽略其中逻辑关系,就当前功能进行设计。
3.初学者容易接受,但是感觉有点绕。
MCV用来分割页面和数据库访问的框架,降低了两者的耦合度,同时通过Controller的控制,也使系统更加的灵活,使我们的代码更健壮,复用性更强。但是个人觉得对于复杂的生产环境,估计不够用,而且有些情况不适用,所以MVC的使用还得深入理解。