快递e栈(集合篇)
文章目录
MVC模式(三层架构模式)
概念:
MVC(Model-View-Controller)是一种框架模式。经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器。
M:即model模型是指模型表示业务规则。
V:即View视图是指用户看到并与之交互的界面。
C:即controller控制器是指控制器接受用户的输入并调用模型和视图去完成用户的需求。
题目:
这样的需求是不是似曾相识?哈哈哈,是的,快递 E 栈又来了,之前我们
已经写了好几个版本,比如数组版,面向对象版。现在呢我们又学习了新知识,快来应用一下,同样的需求,这里我们要求使用集合的技术点来实现。学会:
以不变应万变
任务过程:
1、明确需求,基于面向对象思想,创建用户类和快递类
2、选择合适的集合保存快递信息,这里涉及到根据指定单号快速定位到快递信息,结合每个集合的特点,这里建议使用 Map 集合进行数据存储,key为快递单号,value 为快递对象
代码实现
1、cn.suzihan.java.courierCabinet.view包
包含的类:View类 用于用户的交互
package cn.suzihan.java.courierCabinet.view;
import cn.suzihan.java.courierCabinet.bean.Express;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/**
* view 视图层
*
* @author sunzihan
*/
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("请输入您的身份:1-快递员 2-用户 0-退出");
String s = input.nextLine();
int number = -1;
try {
number = Integer.parseInt(s);
} catch (NumberFormatException e) {
}
if (number < 0 || number > 2) {
System.out.println("您的输入有误,请重新输入!");
return menu();
}
return number;
}
/**
* 快递员菜单
*
* @return
*/
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 s = input.nextLine();
int number = -1;
try {
number = Integer.parseInt(s);
} catch (NumberFormatException e) {
}
if (number < 0 || number > 4) {
System.out.println("您的输入有误,请重新输入!");
return courierMenu();
}
return number;
}
/**
* 用户界面
*
* @return
*/
public String userMenu() {
System.out.println("请按照提示完成操作:");
System.out.println("请输入6位取件码:");
String s = input.nextLine();
int number = -1;
try {
number = Integer.parseInt(s);
} catch (NumberFormatException e) {
}
if (number < 100000 || number > 999999) {
System.out.println("您的输入有误,请重新输入!");
return userMenu();
}
return s;
}
/**
* 添加快递单号
*/
public String addNumber() {
System.out.println("请按照提示完成操作:");
System.out.println("请输入快递单号:");
String number = input.nextLine();
return number;
}
/**
* 添加快递其他信息
*/
public Express addElse() {
System.out.println("请输入快递公司:");
String company = input.nextLine();
Express express = new Express();
express.setCompany(company);
return express;
}
/**
* 操作快递单号
*/
public String findNumber() {
System.out.println("请按照提示完成操作:");
System.out.println("请输入要操作的快递单号:");
String number = input.nextLine();
return number;
}
/**
* 修改快递信息
*/
public Express update() {
System.out.println("请输入新的快递单号:");
String number = input.nextLine();
System.out.println("请输入新的快递公司:");
String company = input.nextLine();
Express express = new Express();
express.setNumber(number);
express.setCompany(company);
return express;
}
/**
* 删除快递信息
*/
public int delete() {
System.out.println("是否要删除此快递:1-是 2-否");
String s = input.nextLine();
int num = -1;
try {
num = Integer.parseInt(s);
} catch (NumberFormatException e) {
}
if (num < 1 || num > 2) {
System.out.println("您的输入有误,请重新输入!");
return delete();
}
return num;
}
/**
* 打印所有信息
*/
public void printAll(HashMap<String, Express> map) {
if (map.size() != 0) {
for (Map.Entry<String, Express> me : map.entrySet()) {
System.out.println(me.getValue());
}
} else {
System.out.println("快递柜无快递!!!");
}
}
/**
* 成功信息打印
*/
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.suzihan.java.courierCabinet.bean包
包含的类:Express类 描述快递对象,包含快递对象的各种属性及方法
package cn.suzihan.java.courierCabinet.bean;
import java.util.Objects;
public class Express {
/**
* position:位置
* code:取件码
* company:公司
* number:单号
*/
private String number;
private int position;
private String code;
private String company;
public Express() {
}
public Express(int position, String code, String company) {
this.position = position;
this.code = code;
this.company = company;
}
@Override
public String toString() {
return "快递单号为:" + number +
", 快递公司为:" + company +
" , 快递位置在:" + position +
"柜 , 取件码为:" + 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);
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public int getPosition() {
return position;
}
public void setPosition(int position) {
this.position = position;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
}
3、cn.suzihan.java.courierCabinet.dao包
包含的类:ExpressDao类 用于数据存储及业务逻辑
package cn.suzihan.java.courierCabinet.dao;
import cn.suzihan.java.courierCabinet.bean.Express;
import java.util.HashMap;
import java.util.Random;
/**
* @author sunzihan
*/
public class ExpressDao {
static Random random = new Random();
static HashMap<String, Express> map = new HashMap<>();
static HashMap<String, String> map1 = new HashMap<>();
/**
* 快递录入
*/
public static boolean add(String number, Express express) {
if (map.containsKey(number)) {
return false;
}
//添加单号信息到Express
express.setNumber(number);
//添加随机6为取件码
String code = codeRandom();
express.setCode(code);
//添加快递柜位置信息
map.put(number, express);
map1.put(code, number);
int position = positionRandom(number);
express.setPosition(position);
return true;
}
/**
* 通过单号查询快递是否存在
* @param number:单号
*/
public static boolean find(String number) {
//根据单号判断单号关键字是否存在
if (map.containsKey(number)) {
return true;
}
return false;
}
/**
* 通过取件码查询快递是否存在
* @param code:取件码
*/
public static boolean findCode(String code) {
//根据取件码判断取件码关键字是否存在
if (map1.containsKey(code)) {
return true;
}
return false;
}
/**
* 修改快递信息
* number为单号
*/
public static boolean update(String number, Express newExpress) {
if (find(number)) {
Express oldExpress = map.get(number);
newExpress.setCode(oldExpress.getCode());
newExpress.setPosition(oldExpress.getPosition());
map.remove(oldExpress.getNumber());
map.put(newExpress.getNumber(), newExpress);
return true;
}
return false;
}
/**
* 删除快递信息
*/
public static boolean delete(String nummer) {
if (find(nummer)) {
map.remove(nummer);
return true;
}
return false;
}
/**
* 删除快递信息
*/
public static boolean deletecode(String code) {
if (findCode(code)) {
map.remove(map1.get(code));
map1.remove(code);
return true;
}
return false;
}
/**
* 生成随机取件码
*/
public static String codeRandom() {
while (true) {
int code1 = random.nextInt(900000) + 100000;
String code = Integer.toString(code1);
if (!map1.containsKey(code)) {
return code;
}
}
}
/**
* 生成随机柜子位置
*/
public static int positionRandom(String number) {
Express express = map.get(number);
while (true) {
int position = random.nextInt(200);
if (express.getPosition() != position) {
return position;
}
}
}
/**
* 打印
*/
public static HashMap<String, Express> print() {
return map;
}
}
4、cn.suzihan.java.courierCabinet.main包
包含的类:Main类 Courier类 User类
Main类
package cn.suzihan.java.courierCabinet.main;
import cn.suzihan.java.courierCabinet.view.View;
public class Main {
public static void main(String[] args) {
View view = new View();
//欢迎
view.welCome();
while (true) {
int menu = view.menu();
switch (menu) {
case 1:
Courier.courier();
break;
case 2:
User.userOprate();
break;
case 0:
view.bye();
return;
}
}
}
}
Courier类
package cn.suzihan.java.courierCabinet.main;
import cn.suzihan.java.courierCabinet.bean.Express;
import cn.suzihan.java.courierCabinet.dao.ExpressDao;
import cn.suzihan.java.courierCabinet.view.View;
import java.util.HashMap;
public class Courier {
static View view = new View();
/**
* Courier页面
*/
public static void courier() {
int num = 1;
while (num != 0) {
int courierMenu = view.courierMenu();
switch (courierMenu) {
case 1:
addOperate();
break;
case 2:
updateOprate();
break;
case 3:
deleteOprate();
break;
case 4:
HashMap<String, Express> print = ExpressDao.print();
view.printAll(print);
break;
case 0:
num = 0;
break;
}
}
}
/**
* 添加信息集成
*/
public static void addOperate() {
String number = view.addNumber();
Express express = view.addElse();
boolean add = ExpressDao.add(number, express);
if (add) {
view.success(1);
} else {
view.fail(1);
}
}
/**
* 修改信息集成
*/
public static void updateOprate() {
String number = view.findNumber();
boolean b = ExpressDao.find(number);
if (b) {
Express newExpress = view.update();
ExpressDao.update(number, newExpress);
view.success(2);
} else {
view.fail(2);
}
}
/**
* 删除信息集成
*/
public static void deleteOprate() {
String number = view.findNumber();
boolean b = ExpressDao.find(number);
if (b) {
int delete = view.delete();
if (delete == 1) {
view.success(3);
ExpressDao.delete(number);
} else if (delete == 2) {
view.fail(3);
return;
}
} else {
view.fail(2);
}
}
}
User类
package cn.suzihan.java.courierCabinet.main;
import cn.suzihan.java.courierCabinet.dao.ExpressDao;
import cn.suzihan.java.courierCabinet.view.View;
public class User {
static View view = new View();
public static void userOprate() {
String code = view.userMenu();
boolean b = ExpressDao.findCode(code);
if (b) {
ExpressDao.deletecode(code);
view.success(4);
} else {
view.fail(4);
}
}
}
题中遇到的问题:
1.用户如何取件?
这道题我是用Map 集合进行数据存储,key为快递单号,value 为快递对象,快递对象里面有快递单号、快递公司、快递柜子位置、取件码等属性
咋们知道map集合我们可以通过key,来取内容值,所以
方案一,再创建一个key为取件码,value为快递单号
方案二,再创建一个key为取件码,value为快递对象
虽然我题目是用方案一,不过我更推荐方案二,各位可以去试一试~~~