快递e栈(初识Mvc框架)
学习面向对象后使用MVC框架实现快递e栈,以下浅谈我对这个题目的思路
文章目录
MVC模式(三层架构模式)
概念:
MVC(Model-View-Controller)是一种框架模式。经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器。
M:即model模型是指模型表示业务规则。
V:即View视图是指用户看到并与之交互的界面。
C:即controller控制器是指控制器接受用户的输入并调用模型和视图去完成用户的需求。
题目:
代码实现:
1、cn.sunzihan.java.view包
包含的类:View类 用于用户的交互
package cn.sunzihan.java.view;
import cn.sunzihan.java.bean.Express;
import java.util.Scanner;
/**
* view 视图层
* @author sunzihan
*/
@SuppressWarnings("AlibabaUndefineMagicConstant")
public class View {
private Scanner input =new Scanner(System.in);
/**
* 欢迎语
*/
public void welcome(){
System.out.println("欢迎使用快递e栈!");
}
/**
* 结束语
*/
public void bye(){
System.out.println("期待您下次的使用");
}
/**
* 菜单
*/
public int menu(){
System.out.println("请根据提示完成操作~~~");
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;
}
/**
* 快递员界面
*/
public int courierMenu(){
System.out.println("请根据提示完成操作~~~");
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 courierMenu();
}
return num;
}
/**
* 用户界面
*/
public int userMenu(){
System.out.println("请输入6位取件码:");
String text = input.nextLine();
int num = -1;
try {
num=Integer.parseInt(text);
}catch (NumberFormatException e){
}
if (num<100000||num>999999){
fail(2);
return userMenu();
}
return num;
}
/**
* 快递员存快递
*/
public Express input(){
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;
}
/**
* 查询
*/
public Express findByNumber(){
System.out.println("请根据提示完成操作~~~");
System.out.println("请输入要操作的快递单号:");
String number = input.nextLine();
Express e =new Express();
e.setNumber(number);
return e;
}
/**
* 快递员修改
*/
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;
}
/**
* 快递员删除
*/
public int detele(){
System.out.println("是否确认删除?1-是,2-否");
String text = input.nextLine();
int num = -1;
try {
num=Integer.parseInt(text);
}catch (NumberFormatException e){
}
if (num<1||num>2){
return detele();
}
return num;
}
/**
* 打印信息
*/
public void printExpress(Express e){
System.out.println("快递单号为:"+e.getNumber()+"快递公司为:"+e.getCompany()+"取件码为:"+e.getCode());
}
/**
* 快递员查看信息
*/
public void printAll(Express[][] e){
for (int i = 0; i <10 ; i++) {
for (int j = 0; j <10 ; j++) {
if (e[i][j]!=null) {
printExpress(e[i][j]);
}
}
}
}
/**
* 成功打印
*/
public void success(int num){
if (num==1) {
System.out.println("快递信息录入成功");
}else if (num == 2){
System.out.println("快递修改成功");
}else if (num == 3){
System.out.println("快递删除成功");
}else if (num == 4){
System.out.println("快递取出成功");
}
}
/**
* 失败打印
*/
public void fail(int num){
if (num==1) {
System.out.println("录入失败,快递柜已满");
}else if (num == 2){
System.out.println("未找到此快递,请重新输入");
}
else if (num == 3){
System.out.println("单号重复,请重新输入");
}
else if (num == 4){
System.out.println("快递删除失败");
}
}
}
2、cn.sunzihan.java.bean包
包含的类:Express类 描述快递对象,包含快递对象的各种属性及方法
package cn.sunzihan.java.bean;
import java.util.Objects;
/**
* 快递信息类
* @author sunzihan
*/
public class Express {
/**
* code:取件码
* number:快递单号
* company:快递公司
*/
private int code;
private String number;
private String company;
public Express() {
}
public Express(int code, String number, String company) {
this.code = code;
this.number = number;
this.company = company;
}
@Override
public String toString() {
return "Express{" +
"code=" + code +
", number='" + number + '\'' +
", company='" + company + '\'' +
'}';
}
@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 int getCode() {
return code;
}
public void setCode(int code) {
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;
}
}
3、cn.sunzihan.java.dao包
包含的类:ExpressDao类 用于数据存储及业务逻辑
@SuppressWarnings("ALL")
public class ExpressDao {
/**
* 创建一个10*10的二维数组。用于存储数据,方式为随机存储
* 创建一个size变量,用于判断数组存储空间是否为满
*/
private Express[][]data=new Express[10][10];
private Random random=new Random();
private int size=0;
/**
* 存入
*/
public boolean add(Express e){
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;
}
}
//将数据存起来
data[x][y]=e;
//每次存入一个数据+1
size++;
//生成6位随机取件码
int code = randomCode();
e.setCode(code);
return true;
}
/**
* 生成6位随机取件码
*/
public int randomCode(){
while (true){
int code=random.nextInt(900000)+100000;
Express e = findBycode(code);
if (e==null){
return code;
}
}
}
/**
* 判断取件码是否重复
*/
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 (code == data[i][j].getCode()) {
return data[i][j];
}
}
}
}
return null;
}
/**
* 判断单号是否重复
*/
public Express findByNumber(Express e){
for (int i = 0; i <10 ; i++) {
for (int j = 0; j <10 ; j++) {
if (data[i][j]!=null) {
if (e.equals(data[i][j])) {
return data[i][j];
}
}
}
}
return null;
}
/**
* 修改快递信息
*/
public boolean update(Express oldExpress,Express newExpress){
Express e=findByNumber(newExpress);
if (e==null||e.equals(oldExpress)){
oldExpress.setNumber(newExpress.getNumber());
oldExpress.setCompany(newExpress.getCompany());
return true;
}
return false;
}
/**
* 删除快递信息
*/
public boolean delete(Express e){
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--;
return true;
}
}
}
return false;
}
/**
* 显示快递信息
*/
public Express[][] printAll(){
return data;
}
}
4、cn.sunzihan.java.mian包
包含的类:Main类 Client类
Main类
package cn.sunzihan.java.mian;
import cn.sunzihan.java.view.View;
/**
* 实现类
*
* @author sunzihan
*/
public class Main {
public static void main(String[] args) {
View v = new View();
//欢迎界面
v.welcome();
//菜单界面
m:while (true) {
int menu = v.menu();
switch (menu) {
case 1:
Client.courierVerb();
break;
case 2:
Client.userVerb();
break;
case 0:
break m;
default:
}
}
v.bye();
}
}
Client类
package cn.sunzihan.java.mian;
import cn.sunzihan.java.bean.Express;
import cn.sunzihan.java.dao.ExpressDao;
import cn.sunzihan.java.view.View;
/**
* @author sunzihan
*/
public class Client {
private static View v = new View();
private static ExpressDao dao = new ExpressDao();
public static void userVerb() {
int code = v.userMenu();
Express e = dao.findBycode(code);
if (e!=null){
dao.delete(e);
v.success(4);
}
}
public static void courierVerb() {
while (true){
int c = v.courierMenu();
switch (c) {
case 1:
deposit();
break;
case 2:
modify();
break;
case 3:
delete();
break;
case 4:
printAll();
break;
case 0:
return;
default:
}
}
}
/**
* 存入快递功能整合
*/
public static void deposit() {
Express e = v.input();
Express e2 = dao.findByNumber(e);
boolean add = dao.add(e);
if (e2 == null) {
if (add) {
v.success(1);
} else {
v.fail(1);
}
} else {
v.fail(3);
}
}
/**
* 修改快递功能整合
*/
public static void modify() {
Express e = v.findByNumber();
Express e2 = dao.findByNumber(e);
if (e2 == null) {
v.fail(2);
} else {
Express e3 = v.update();
dao.findByNumber(e3);
dao.update(e2, e3);
v.success(2);
}
}
/**
* 删除快递功能整合
*/
public static void delete() {
Express e = v.findByNumber();
Express e2 = dao.findByNumber(e);
if (e2 == null) {
v.fail(2);
} else {
int celcet = v.detele();
if (celcet == 1) {
dao.delete(e2);
v.success(3);
} else {
v.fail(4);
return;
}
}
}
/**
* 查看快递功能整合
*/
public static void printAll() {
v.printAll(dao.printAll());
}
}
思维导图:
题中思考的问题:
1.如何判断数组容器是否为满?
答:通过添加size变量,每添加数据1次,就加1,每次删除数据就减1。
2.如何产生随机的6位取件码?
**
* 生成6位随机取件码
*/
public int randomCode(){
Random random=new Random();
while (true){
int code=random.nextInt(900000)+100000;
Express e = findBycode(code);
if (e==null){
return code;
}
}
}
3.如何判断单号是否已存在?
其中二维数组为:Express[][]data = new Express[10][10];
/**
* 判断单号是否重复
*/
public Express findByNumber(Express e){
for (int i = 0; i <10 ; i++) {
for (int j = 0; j <10 ; j++) {
if (data[i][j]!=null) {
if (e.equals(data[i][j])) {
return data[i][j];
}
}
}
}
return null;
}
4.如何判断取件码是否已存在?
/**
* 判断取件码是否重复
*/
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 (code == data[i][j].getCode()) {
return data[i][j];
}
}
}
}
return null;
遇到的问题
如何判断什么时候该用有返回值的方法或有参数的方法?
当你的方法需要用到本方法没有的数据时就需要参数,写在方法声明的小括号里,这个参数叫形式参数,将来调用者调用这个方法的时候,需要按照你定义的小括号里面的参数列表去传递数据,调用者传进方法里的数据就是实际参数。 调用这个方法会返回数据的时候就要有返回值,如果只是打印或者不返回数据,就不需要定义返回值。